剑指offer --algorithm (持续更新)

操千曲而识谱,认千剑而知器,学而问者千篇,悟者为上

  • 题1---singleton 模式
该题的本意或者说想要达到的理想目的是:改变一个子类的属性,不管声明多少个新的不同的实例对象,其相应的属性值是一样的

在进行编码之前,预备知识有两点,一就是__ new _(cls)与_ init __ (self) 之间的区别,二就是super()单线程子类继承

  • 用一句话概括就是前者是声明的一个实例,而后者声明的是一个对象,直白的讲,比如你想要把一堆人分为一类,那么你需要先从这一堆人中找一个对象,然后自定义的给他声明一些属性(胡子,身高等)这就是init 初始化的作用,而你要判断这些属性适合不适合于其他的人,你就要从这堆人中找到一个人,而这个人就是你要研究的实例对象
...     def print_c(self): 
...       print"hello world!"
...        
class child(hello): 
...     def print_c(self): 
...         super(child,self).print_c() 
...          
 child().print_c() 
hello world!

下面开始解题
方法一:利用继承类来实现

class singleton1(object):
    def __new__(cls):
        if not hasattr(cls,'instance'):#当假设cls这个实例没有instance属性的时候
            ori=super(singleton1,cls)#将sington1作为cls的一个子类,重新定义了一个新的类
            cls.intsance=ori.__new__(cls)
        return cls.intsance
    
    
class my(singleton1):
    def __init__(self):
        self.a=1
    

def main():
    l1=my()
    l2=my()
    print (l1==l2)
    l1.a=3
    print (l2.a)
    print (l1.a)
   
    
if __name__=='__main__':
    main()

方法二:只需要super 声明的子类具有和原来的实例cls 具备同样的属性即可

class singleton(object):
    dic={}
    def __new__(cls):
        descent=super(singleton,cls)#声明一个子类
        descent.__dict__=cls.dic#子类和父类实例的属性相同
        return descent

class mysecond(singleton1):
     def __init__(self):
        self.a=1
    
def main():
    l1=mysecond()
    l2=mysecond()
    print (l1==l2)
    l1.a=3
    print (l2.a)
    print (l1.a)

方法三:最为简单,其本质上没有两个两个实例之间的互动,而是通过__ init __的属性初始化完成单线程的目的

class mythird(object):
    def __init__(self,a):
        self.a=a

def main():
    l1=mythird()
    l2=mythird()
    l1.a=3
    print (l2.a)
  • 题2---二维数组的查找
    查找一个数是否属于一个二维数组,原题信息如下截图:


    image.png

    解题的过程实际上就是选择algorithm 的过程,这也是为什么算法这么的重要,在该书中有这么一段话很值得算法研究人员的思考(可能对我这种菜鸟感触太大了),因此摘录下来:

当我们分析一个复杂的问题的时候,无从下手,或者后续步骤越来越复杂,使得开头容易,后续剪不断理还乱的思绪交叉,这时候就需要从一个简单的具体实例出发,试图寻找其普遍规律 ----书中以插找7为例,首先右上角9>7,因此根据二维数组的排布规律,可以删除该列,一直删除到前两列,由于2<7所以删除行,直到在 删除1前两行后,检测到7

  • 普适规律:首先选取右上角的数,如果该数字等于要查找的数,就停止查找,否则如果该数字大于要查找的数字,就删除对应的列,反之,就删除对应的行

下面为封装代码:

#二维数组的查找,算法就是根据书中的理念
import numpy as np 
import pandas as pd 
from pandas import Series
from pandas import DataFrame 
#下面的例子是以整数二维数组为例
class search(object):
    #在全局变量中定义一个array可以用np.arange(12).reshape((3,4))
    def __init__(self,array,target):
        self.array=array
        self.target=target
    def judge(self):
        list=[]
        if self.array==np.array(list):
            return False
    def num(self):
        row=int(np.shape(self.array)[0])#得到行数
        column=int(np.shape(self.array)[1])#得到列数
        return column,row
       
    def permit(self):
        if type(self.target)!=int:
            self.target=int(self.target)#对其格式进行匹配
    def finder(self):
        i,j=self.num()#通过num()方法拿到列数行数
        m=0#重新定义行数
        n=i-1#将列数赋值给n,之所以为i-1,是因为列索引是从0开始的
        while n>=0 and m<=(j-1):#当列数还在索引范围之内,且行数也在索引范围之内时
            if self.array[m][n]self.target:
                n-=1
            else:
                return True
        return False
        print ('the target was not in this aimed array')
                
        
        

        
 
def main():
    array=np.arange(12).reshape((3,4))
    s=search(array,8)
    s.finder()
     
if __name__=='__main__':
     main()
  • 最近在看了不起的匠人,希望能够静心,2018新年的第一集:“非静而无以为学,摒言、听步、闻鼠
  • 除去不可抗力因素外,希望能一日两题,持续更新
  • Freedom as autonomy

你可能感兴趣的:(剑指offer --algorithm (持续更新))