美文网首页
剑指offer--algorithm6

剑指offer--algorithm6

作者: strive鱼 | 来源:发表于2018-05-09 17:43 被阅读0次

    接下来会在开头简单的整理下月童度河每天所读部分的读书笔记,增加仪式感和思考的精度,抛砖引玉,希望能为看到文章的朋友带来一些生活的启示,认真生活,踏踏实实写代码,复盘代码

    • 相爱
      我问他为什么要睡我的房间,他说,人生可贵,我和你在一起的机会不多
      深爱的本质是悲悯
      爱一个人,先让心清爽和温厚起来是首要
      只管走着,不必逗留,去采摘临路的鲜花来保存,因为一路上,花会继续自然地开着......人们应该带着更多的了解来彼此靠近,说,当我靠近你,我心里某些东西开始舞蹈,如果你和我有同样的感觉,或许我们可以相处几天.......人生短暂
      好的关系,应该共行趋向解脱,而不是使彼此陷入更深的轮回,初级的爱是一种深深的束缚和缠绕,高级的爱是得以解脱
    • 葬礼
      泰戈尔--像一群思想的鹤鸟,日夜飞向他们的山巢,在我向你合十膜拜之中,让我全部的声明,启程回到它永久的家乡

    题12--调整数组顺序奇数位与偶数的前面
    关于本题的解题思路书中上进行了示例演示、方法依旧是在数组的前后设立指针


    image.png
    image.png

    在进行解题之前,需要了解位与判断奇偶的方

    • 0x开头表示的是16进制,0开头是8进制,无特殊符号的为10进制,0x1表示为00000001
    • k&0x1如果得到的结果为1,说明k为奇数,如果为0,说明k为偶数

    下面为代码和注释部分,分为两种方法一种是简单的基本方法,另外一种是加入了扩展函数,可以通过改变扩展函数来解决类似的问题(比如:把能被3整除的数放置在不能被三整除的数前面)

    方法1
    利用位与运算
    """
    class solution(object):
        def __init__(self,array,odd=[],even=[]):
            self.array=array#自定义数组
            self.odd=odd#存储奇数的列表
            self.even=even#存储偶数的列表
        def odd_even(self):
            if self.array==[]:
                return None
            if len(self.array)==1:
                return self.array[0]
            for i in self.array:
                if i & 0x1==0:#说明为偶数
                    self.even.append(i)
                if i & 0x1==1:#s说明为偶数
                    self.odd.append(i)
            return self.odd+self.even 
        
        
    def main():
        s=solution([1,2,3,4,5,6,7])
        print (s.odd_even())
        
    
    if __name__=='__main__':
        main()
    
    """
    方法2
    指针和扩展函数的使用
    """
    class solution(object):
        def __init__(self,array):
            self.array=array
        def odd_even(self):#其中func为扩展的功能函数,只写进去函数名字即可
            if len(self.array)==0:#当自定义的数组为空的时候
                return None
            if len(self.array)==1:#当自定义的数组为1的时候
                return self.array[0]
            a_begin=0#第一个指针设定在头部
            a_end=len(self.array)-1#第二个指针设定在尾部
            while a_begin<a_end:#当前指针的索引值小于后指针的索引值的时候,说明换位还没有结束
                while a_begin<a_end and not self.is_even(self.array[a_begin]):#当前指针的索引值小于后指针的索引值且,对应的值不是偶数时
                    a_begin+=1#前移一位
                while a_begin<a_end and self.is_even(self.array[a_end]):#当前指针的索引值小于后指针的索引值且,对应的值是偶数时
                    a_end-=1
                if a_begin<a_end:#当进行了前边的指针移动后,如果前指针的索引还小于后指针的索引的时候
                    self.array[a_begin],self.array[a_end]=self.array[a_end],self.array[a_begin]#互换位置
            return self.array
        def is_even(self,n):
            return not n&0x1 #n&0x1默认的输出值为1,因此该函数返回的正向结果是偶数,即偶数为True,奇数为False
    def main():
        s=solution([1,2,3,4,5,6,7])
        #print (type(s.odd_even()))
        print (s.odd_even())
        
    if __name__=='__main__':
        main()
    

    在进行下一题的切换之前,进行一些概念的陈述

    • 鲁棒性(Robust)
      指的是程序能够判断输入是否合乎规范要求,并对不合要求的输入予以合理的处理。容错性是鲁棒性的一个重要的特点
      本质上就是要多考虑边界性的问题

    题13--链表中倒数第k个节点
    输入一个链表,输出链表的第k个节点
    刚开始的时候会想到先遍历到链表的最后,然后再回溯k步,但是,单向链表的只有从前往后的指针,但是没有从后往前的指针,所以此思路对于单向链表行不通

    那么书中提供了两种思路第一就是需要遍历链表两次

    image.png

    正如上边所讲的,如果面试官需要你只遍历一次单向链表,那该是怎样的思路呢?本题的思路十分的巧妙和新奇,书中是这样描述的


    image.png
    image.png

    有了以上的思路后,下面为代码和注释部分:

    """
    遍历单线链表一次
    输出倒数第k个节点
    """
    class node(object):#定义一个单向链表
        def __init__(self,value=None,next=None):
            self.value=value
            self.next=None
            
    
    
    
           
    class solution(object):
        def printk_node(self,head,k):#两个变量,一个是链表头,即是第一个指针的起始位置,k为要输出的节点的倒数第k个的位置
            if head==None or k<=0:#首先考虑到边界问题
                return None
            pointer_ahead=head#首先将前指针实例化为表头
            pointer_behind=None#初始化第二个指针,因为第一个指针还没有向前移动,所以第二个指针初始化为None
            for i in range(k-1):#第一个指针开始移动
                if pointer_ahead.next!=None:
                    pointer_ahead=pointer_ahead.next
                else:
                    return pointer_ahead.value
            pointer_behind=head#当第一个指针移动K-1步的时候,第二个指针从表头开始准备遍历
            while pointer_ahead.next!=None:#说明还没遍历到链表的尾部
                pointer_ahead=pointer_ahead.next#第一个指针继续后移
                pointer_behind=pointer_behind.next#第二个指针也后移
            return pointer_behind#最终返回该节点,就是我们要找的倒数第k个节点
        
            
     
    
    
    
           
    def main():
        n1=node(1)
        n2=node(2)
        n3=node(3)
        n4=node(4)
        n5=node(5)
        n1.next=n2
        n2.next=n3
        n3.next=n4
        n4.next=n5
        s=solution()
        print (s.printk_node(n1,1).value)
        
    if __name__=='__main__':
        main()
    

    今天的结语是: persistence、 persistence、 persistence!

    相关文章

      网友评论

          本文标题:剑指offer--algorithm6

          本文链接:https://www.haomeiwen.com/subject/xmqnrftx.html