編程題思路1

 

1反轉鏈表

 

2節點兩兩反轉

 

3判斷鏈表是否有環

 

  1  0.5毫秒內是否出現Null

 2  set中查重

 3 快慢指針

4匹配左右括號

 

 

5實時判斷第K大的元素

  大頂堆  實時排序

 

6 亂序判斷

法一:sort  NlogN

return sorted(s)==sorted(t)

法二:數出現過個個數,用map計數

 

 

 

 

6兩數之和 一個數組中兩個數相加滿足條件

sum==two of array[2,3,4,5]

 

7三數之和

a+b+c==D

 

法一:暴力法  三層循環嵌套

法二:c=-(a+b)   -->放到一個set中

a  b兩層循環  每次查詢set中 -(a+b) 

法三: sort  find

 

樹代碼

 

計算x的n次方,遞歸分治

def  pow(self,x,n):

if  not n:

  return 1

if  n<0:

  return  1/self.pow(x,-n)

if  n%2:

  return x*self.pow(x,n-1)

return self.pow(x*x,n/2)

 

位運算非遞歸

class mypaw:
    def mypaw(self,x,n):
        if n<0:
            x=1/x
            n=-n
        pow=1
        while n:
            if n&1 :
                pow *=x
            x *=x
            n>>=1
        return pow

 

求衆數

排序; 暴力;分治

 

hashtable  同步  不允許NONE的k或v

hashset     基於map上省略value

hashmap   不同步,非線程有更好效率,允許一個none K 或者V

 

 

內排序:在內存中進行排序,不需要磁盤讀寫,一般假定所有用到的輔助空間也可以直接存在於內存中

外排序:需要磁盤訪問,每次讀入部分數據到內存進行排序

 

歸併排序  merge sort  分治 nlogn  最壞 n**2

快排: quick sort  也是分治  隨機選一個軸 再左右兩部分 nlogn  平均N   額外空間logn

桶排序  bucket sort   radix sort    k*N

 

1.N皇后問題

N個皇后放在n*n棋盤山  使之不相互攻擊

class Nqueen:
    def solveNQueen(self,n):
        if n <1 :return []
        self.result =[]
        self.cols =set();self.pie=set();self.na=set()
        self.DFS(n,0,[])
        return self._generate_result(n)
    def DFS(self,n,row,cur_state):
        if row>=n:
            self.result.append(cur_state)
            return
        for col in range(n):
            if col in self.cols or row+col in self.pie or row-col in self.na:
                continue
            self.cols.add(col)
            self.pie.add(row+col)
            self.na.add(row-col)
            self.DFS(n,row+1,cur_state+[col])
            self.cols.remove(col)
            self.pie.remove(row+col)
            self.na.remove(row-col)

    def _generate_result(self,n):
        board=[]
        for res in self.result:
            for i in res:
                board.append("."*i+"Q"+"."*(n-1-n))
        return [board[i:i+n] for i in range(0,len(board),n)]

 

class NQueen:
    def NQueen(self,n):
        def DFS(queens,pie,na):
            p = len(queens)
            if p==n:
                result.append(queens)
                return None
            for q in range(n):
                if q not in queens and p-q not in pie and p+q not in na:
                    DFS(queens+[q],pie+[p-q],na+[p+q])
        result=[]
        DFS=([],[],[])
        return [ ["."*i+"Q"+"."*(n-i-1) for i in sol] for sol in result  ]

 

2數獨問題

9*9格子

行 列 只能1--9不能重複

每個3*3block不能重複

public class shudu {
    public void shudu(char[][] board){
        if (board==null || board.length==0) return;
        solve(board);
    }
    public boolean solve(char[][] board){
        for (int i=0;i<board.length;i++)  for (int j=0;j<board[0].length;j++){
            if (board[i][j]=='.'){
                for (char c='1';c<='9';c++){
                    if (isValid(board,i,j,c)){
                        board[i][j]=c;
                        if(solve(board))
                            return true;
                        else
                            board[i][j]='.';
                    }
                }
                return false;
            }
        }
        return true;
    }
    public boolean isValid(char[][] board,int row,int col,char c){
        for(int i=0;i<9;i++){
            if(board[i][col] !='.' &&board[i][col]==c) return false;
            if(board[row][i] !='.' &&board[row][i]==c) return false;
            if(board[3*(row/3)+i/3][3*(col/3)+i%3] !='.'
            && board[3*(row/3)+i/3][3*(col/3)+i%3] ==c) return false;
        }
        return  true;
    }

}

 

位運算

 

統計1的 個數

def ham(self,n)
    res=0
    mask=1
    for i in range(32):
        if n &mask:
            res +=1
        mask == mask <<1
    return res

C++

int ham(uint32_t n){
int res=0;
for (;n;n&=n-1)
    ++ res;
return resl
}

 

判斷是否爲2的N次方

bool isA(int n){
    return n>0 && !(n&(n-1));
}

或者

def isA(self,n):
    return n>0 and not (n&n-1)

 

取一個數N,返回這個數0-N之間所有二進制1個數的數組

using namespace std;
vector<int> countBits(int num){
    vector<int> bits(num+1,0); //填充num+1個 默認值爲0
    for(int i=1;i<=num;i++){
        bits[i] +=bits[i&(i-1)] +1;
    }
    return bits;
}

 

N皇后問題

class weiNQueen:
    def total(self,n):
        if n<1:return []
        self.count =0
        self.DFS(n,0,0,0,0)
        return self.count
    def DFS(self,n,row,cols,pie,na):
        if row >=n:
            self.count +=1
            return
        bits= (~(cols|pie|na)& ((1<<n)-1))  #得到當前所有空位

        while bits:
            p=bits & -bits  #-bits表示取反加1,~表示只取反,p 取到最低位的1
            self.DFS(n,row+1,cols|p,(pie|p) <<1,(na|p)>>1)
            bits=bits &(bits -1) #去掉最低位的1
A=weiNQueen()
print(A.total(4))

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章