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 resC++
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))