剑指offer--algorithm4

2018-05-04  本文已影响0人  strive鱼

在写之前,顺便逛了一下仁兄的主页,受益匪浅,把自己有所感悟的地方摘抄下来,慢慢领悟
关于效率--产能和产出

真正的效能应该包含两个要素:一是“产出”,即金蛋;二是“产能”——生产的资产或能力,即下金蛋的鹅。
在生活中“重蛋轻鹅”的人,最终会连这个产金蛋的资产也保不住。反之,“重鹅轻蛋”的人,最后自己都可能会被活活饿死,更不用说鹅了。
所以,效能在于产出与产能的平衡。

日常生活中,你是否曾为了多收获几枚金蛋而废寝忘食地工作,结果弄得精疲力竭,无法继续工作?其实若能好好睡一觉,那么第二天就会精力充沛,完成更多的工作,更好地迎接这一天的挑战。
再比如,你强迫别人按你的意志行事,结果却发现你们的关系变得空洞无物;反过来,如果你能用时用心经营人际关系,就能赢得信任与合作,通过开诚布公的交流获得实质性的进展。

对待爱

“可是没有爱,你让我怎么去爱呢?”
“老兄,爱是一个动词,爱的感觉是爱的行动所带来的成果,所以请你爱她,为她服务,为她牺牲,聆听她心里的话,设身处地为她着想,欣赏她,肯定她。你愿意吗?”
在所有进步的社会中,爱都是代表动作,但消极被动的人却把爱当做一种感觉。好莱坞式的电影就常灌输这种不必为爱负责的观念——因为爱只是感觉,没有感觉,便没有爱。事实上,任由感觉左右行为是不负责任的做法。

以一灌之的原则性---男人的一生应树立自始不变的价值观 目前做人最失败之处,摇摆不定,瞻前顾后,价值观匮乏

现在假定你已经买好票,准备晚上与配偶一起去听音乐会,对方兴奋不已,满怀期待。
可是下午四点钟,老板突然来电话要你晚上加班,理由是第二天上午九点钟有一个重要会议。
◆对以家庭或配偶为中心的人而言,当然是优先考虑配偶的感觉,为了不让他(她)失望,你很可能会委婉地拒绝老板。即使为了保住工作而勉强留下来加班,心里也一定十分不情愿,担心着配偶的反应,想着用什么合适的理由来平息他(她)的失望与不满。
◆以金钱为中心的人则看重加班费或加班对于老板调薪决策的影响,于是理直气壮地告诉配偶自己要加班,并理所当然地认为对方应该谅解,毕竟经济利益高于一切。
◆以工作为中心的人会觉得正中下怀,因为加班既可以让自己增加经验,又是一个很好的表现机会,有利晋升,所以不论是否需要,都会自动延长加班时间,并想当然地以为配偶会以此为荣,不会为爽约一事小题大做。
◆以名利为中心的人,会算计~下加班费能买到什么,或者考虑一下加班对个人形象有何助益,比如赢得一个为工作而牺牲自己的美誉。
◆以享乐为中心的人,即使配偶并不介意,也还是会撇下工作赴约,因为实在需要犒劳自己一下。

以原则为中心的人会保持冷静和客观,不受情绪或其他因素的干扰,综观全局——工作需要、家庭需要、其他相关因素以及不同决定的可能后果,深思熟虑后才做出正确的选择。

双赢思维--情侣之间,合作伙伴之间,如果不能双赢,宁可不做,毕竟互不相欠,任意无所的违心妥协,都是不正当的人际关系

在相互依赖的环境里,任何非双赢的解决方案都不是最好的,因为它们终将对长远的关系产生这样那样的不利影响,你必须慎重对待这些影响的代价。如果你无法同对方达成双赢的协议,那么最好选择放弃。
在家里,“不能双赢就干脆放弃”这个原则也能让大家感到轻松自由。如果在看什么电影的问题上僵持不下,那么不如放弃看电影,做些别的事情,总比这个夜晚有人欢喜有人愁的要好。

有效沟通、有效沟通、有效沟通--重要的事情说三遍,自己做的很失败! 关键在于抓重点、逻辑的清晰度、对整体事物的宏观把控

接下来进入正题

题7--查找和排序
查找的方法无外乎有三种--二分查找、哈希表查找、二叉排序树查找
排序的方法有--插入排序、冒泡排序、归并排序、快速排序

题目如下---旋转数组的最小数字

把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。
输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。
例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。

本题可能遇到的情况有两种:
第一是第一个指针、第二个指针所指的数字和两个指针之间的数字不相同--二分查找
第一是第一个指针、第二个指针所指的数字和两个指针之间的数字相同--顺序查找
具体的思路,书中很清楚,摘录如下:


image.png
image.png image.png
image.png

下面是程序的代码和注释:


class solution (object):
    def min_number(self,rotatearray):
        if len(rotatearray)==0:
            return 0
        front=0#前指针的位置
        last=len(rotatearray)-1#后指针的位置
        midindex=0#初始化中间索引的位置
        while rotatearray[front]>=rotatearray[last]:#第一种情况,使用二分查找
            if (int(last)-int(front))==1:#当两个指针的差值为1的时候,说明已经检索到位了
                midindex=last#将last的索引值赋值给midinex
                break#结束
            midindex=(int(front)+int(last))//2#整数除法,返回不大于该浮点值的整数,也就是前指针或者后指针所要移动的位置,重新定义中间索引的位置
            if rotatearray[front]==rotatearray[last] and rotatearray[last]==rotatearray[midindex]:#第二种情况当头指针的数字,与尾指针的数字以及中间位置的数字相同时,采用顺序查找法
                return self.equal(rotatearray,front,last)#调用下一个方法
            if rotatearray[front]<=rotatearray[midindex]:
                front=midindex#挪动前指针的位置
            if rotatearray[midindex]<=rotatearray[last]:
                last=midindex#挪动后指针的位置
        return rotatearray[midindex]#当第一个指针所指的数字小于另外一个指针所指的数字的时候,比如[1,2,3,4,5],那么就返回midindex=0,即序列中的第一个数
    def equal(self,rotatearray,first,end):#第二种情况顺序方法
        result=rotatearray[0]#初始化要进行比较的数据
        for i in rotatearray[first:end+1]:
            if i<result:
                result=i#赋值,逐一比较
        return result 
    
                


def main():
    test=solution()
    #minnumber=test.min_number([3,4,5,1,2])
    minnumber=test.min_number([1,2,3,4,5])
    print (minnumber)
    
if __name__=='__main__':
    main()

题8--递归和循环

递归一般代码简洁,由于循环的代码,但是也有其缺点,递归为函数自己调用自己,每一次调用都需要在内存栈中分配空间以保存参数、返回地址和临时变量、往栈里压入和弹出数据都需要时间

题目如下--斐波那契数列

当数的个数为零时,返回零、数的个数为1时返回1,数的个数大于1时,后一个数为前两个数的和
斐波那契函数的变种题即为青蛙跳,关于两者的联系,书中是这样介绍的:

image.png

代码和注释:

"""
一般来讲斐波那契函数都是第一个数为0,第二个数为1
我在程序里稍作改动,可以更加灵活的改变斐波那契的前两个数
"""
class solution(object):
    def __init__(self,array,n):
        self.array=array
        self.n=n 
    def fb(self):
        num=len(self.array)
        if int(num)==0:
            return 0
        if int(num)==1:
            return 1
        elif int(num)>1:
             return self.dg_solution(self.n)
    def dg_solution(self,m):
        if m<=len(self.array):
            return self.array[m-1]
        else:
             return (self.dg_solution(m-1)+self.dg_solution(m-2))
         
            
def main():
    test=solution([1,2],5)
    print (test.fb())
    
if __name__=='__main__':
    main()

多读书,树立坚定地人生观,坚持读完月童度河,下次见面,希望有新的书单list

上一篇下一篇

猜你喜欢

热点阅读