剑指offer--algorithm6

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

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

题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!

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

推荐阅读更多精彩内容

  • 链表 记录《剑指offer》中所有关于链表的题目,以及LeetCode中的相似题目 相关题目列表 题目 链表是面试...
    wenmingxing阅读 1,162评论 0 11
  • 前言 2. 实现 Singleton 3. 数组中重复的数字 4. 二维数组中的查找 5. 替换空格 6. 从尾到...
    Observer_____阅读 2,922评论 0 1
  • 树 记录《剑指offer》中所有关于树的题目,以及LeetCode中的相似题目。 相关题目列表 题目 树是一种最常...
    wenmingxing阅读 1,414评论 2 13
  • 宁博Villa阅读 203评论 2 1
  • 多年以来无人问津 岁月在这里专注于一件事 掀起蒙尘窗纱 时光将镜子磨花 一张越剧海报 从黑与白的时代探出头 盼望着...
    雲归阅读 372评论 0 0