剑指offer--algorithm5

最近开始尝试告别手机,缩短与手机接触的时间,买了一个随身包,用来装书,在地铁里把这些散碎的时间利用起来。

题9--数值的整数次方

本题的关键有三点

  • 考虑到指数运算的边界问题
  • 如何减少循环的次数,从而提高指数运算的效率
  • 利用右移和位与运算方法,来代替除以2和求余的运算,将代码进行优化
image.png

image.png

image.png

image.png

image.png

下面为代码:


class Solution:
    def power(self, base, exponent):
        if exponent == 0:
            return 1
        if exponent == 1:
            return base
        if exponent == -1:
            return 1/base
        result = self.power(base, exponent >> 1)
        result *= result
        if (exponent & 0x1) == 1:#奇数次幂
            result *= base
        return result



def main():
     s=Solution()
     print (s.power(2,3))
     
if __name__=='__main__':
    main()

题10--从1打印到最大数
题目:输入一个数,即从1打印到以该数为最大位数的值,比如3,则从1打印到999

书中对于本题给出了两种解题的思路,最为简单的思路即是我们在数字前面补0,发现n位十进制的数实际上就是n个从1到9的数的全排列 ------**巧妙利用递归不仅可以使得代码简洁,而且也更加的有效

下面为代码:

"""
本题的思路非常有趣,注意掌握
递归的使用
"""

class solution(object):
    def __init__(self,n):
        self.n=n 
    def print_number(self,number):
        isbeginning0=True#flag的设立,用于判断最前边的数字是否为0
        len_number=len(number)
        for i in range(len_number):
            if isbeginning0 and number[i]!=0:#当遍历后发现有不为0的数存在
                isbeginning0=False
            if not isbeginning0:
                print ('%s'%number[i],end='')#python3中end的用法是结尾不加换行符,这样做可以将不为0的数字全部串联起来
        print ('')
    def number_recursion(self):#开始构造,思路是将数字问题转化为字符串
        if self.n<0:
            return None 
        number=['0']*self.n#构造一个n位的字符串
        for i in range(10):
            number[0]=str(i)#先确定数字最高位的值,且转化为字符串
            self.print1tomax(number,0)#第一次递归
    def  print1tomax(self,number,index):
        if index==(self.n-1):#当索引到达最低位的时候
            self.print_number(number)#打印该数字
        else:
            for i in range(10):
                number[index+1]=str(i)
                self.print1tomax(number,index+1)#第二次递归
                


        
def main():
    test=solution(3)
    test.number_recursion()
    
    
    
if __name__=='__main__':
    main()

题11--在O(1)时间内删除链表的节点
删除链表的节点,首先想到的思路就是顺序检索,然后找到要删除的节点,随之删除。但是这样的时间 复杂度为O(n),书中对于此也有所解释

image.png

那为什么我们一般只会想到这个思路呢?
image.png

那是否一定要得到我们所要删除的节点的前一个节点才能进行删除工作呢?答案也是否定的,这就是O(1)思路的由来
image.png

当然,除了这些之外,还要考虑到边缘问题

image.png

下面为代码注释部分:

class node(object):
    def __init__(self,x=None):
        self.value=x#节点的值
        self.next=None#节点的指向   
    def logg(self):#用于看清链表的结构
        while self is not None:
            print ('value',self.value)
            self=self.next
    
class solution(object):
    def __del__(self):#用于删除节点的函数
        self.value=None
        self.next=None
    def delatenode(self,nodehead,node_delete):#两个参数,一个是头结点,一个是要删除的节点
        if not nodehead or not node_delete:#当没有检测到这样的头结点或者要删除的节点的时候
            return None
        if node_delete.next!=None:#当要删除的节点有后续节点时
            n_next=node_delete.next#实例化要删除节点的后续节点
            node_delete.next=n_next.next#将要删除节点的指针指向原先它的下一个节点的指针指向
            node_delete.value=n_next.value#将要删除的后续节点的值赋值给要删除的节点本身,形成覆盖
            n_next.__del__()#删除原本要删除的节点的后一个节点
        elif nodehead==node_delete:#当要删除的节点就是头节点的时候
            nodehead.__del__()
            nodehead.__del__()
        else:#表明要删除的节点为尾部节点,只能遍历
            phead=nodehead#进行一次实例性的赋值
            while phead.next!=node_delete:#当遍历的下一个节点不是尾部节点的时候
                phead=phead.next#向前遍历
            phead.next=None#一直遍历到倒数第二个节点的时候,将其后续的节点转化为None
            node_delete.__del__()#最后切掉原本要删除的节点,即是原来的尾节2点
            
            
            
        

            
    




def main():          
    n1=node(1)
    n2=node(2)
    n3=node(3)
    n4=node(4)
    n1.next=n2
    n2.next=n3
    n3.next=n4  
    n1.logg()#这个实例调用很重要
    #s=solution()
    #s.delatenode(n1,n2)
    
        
                
if __name__=='__main__':
    main()

雷布斯的故事告诉我们--1.之前他说 只有愚笨的人才没日没夜的工作,当上市后,福布斯排第5的时候,我知道又一次被骗了, 不要肆意玩耍却活在别人大智若愚的谎言里

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,451评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,172评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,782评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,709评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,733评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,578评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,320评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,241评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,686评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,878评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,992评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,715评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,336评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,912评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,040评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,173评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,947评论 2 355