題號 771(簡單題)
描述:查找S字符串中每一個元素是否在J中出現,並求和
思路:String find 函數 或者 hash結構
int count = 0;
int a[150] = {0};
for(auto i:J){
a[i] = 1;
}
for(auto i:S){
if(a[i] == 1){
count++;
}
}
/*for(auto i:S) {
if(J.find(i) != J.npos){
count++;
}
}*/
return count;
題號1104(中等題)
描述:一條龍二叉樹尋路問題 https://leetcode-cn.com/problems/path-in-zigzag-labelled-binary-tree/
方法一:需要注意的點,由於是一條龍的順序,所以不能直接進行除以二的操作以查找父節點,需要進行轉換
轉換的方法是,t = a + b -x a = 2^level-1 b = 2^(level-1) x爲元素值 t爲父節點
int level = (log(label) / log(2)) + 1;//4
int a;
vector<int> path(level);
path[level-1] = label;//p[3]=14
level = level-1;//3
while(level!=0){
if(level % 2 == 1){
a = pow(2,level+1) -1 + pow(2,level) -label;//9
a = a/2;//4
path[level-1] = a;//path[2]=4
}
else{
a = label / 2;
a = pow(2,level) -1 + pow(2,level-1) -a;
path[level-1] = a;
}
level--;
label=a;
}
path[0] = 1;
return path;
方法二:位運算
因爲以1爲根節點層次編號的滿二叉樹可以對應到位的表示,所以用位運算的思路即可。
因爲每層的順序在變,所以每次需要對首位外的其它位取反。
舉例14=1110b,
先將14右移,變爲111b,然後對除第一位外所有位取反變爲100b,即它的根節點4,
同理100b,右移變爲10b,對除第一位外所有位取反變爲11b,即它的根節點3
一直到1結束。
代碼後期補上
題號 1122(簡單題)
描述:
給你兩個數組,arr1 和 arr2,
arr2 中的元素各不相同
arr2 中的每個元素都出現在 arr1 中
對 arr1 中的元素進行排序,使 arr1 中項的相對順序和 arr2 中的相對順序相同。未在 arr2 中出現過的元素需要按照升序放在 arr1 的末尾。
思路一:最弱智的想法,時間複雜度O(n*m),對兩個vector進行掃描,然後看是否在arr2中出現,如果出現的話,放入vector res中,最後把沒出現過的同意放到末尾處,未出現的元素要求升序
思路二:類似於771的hash思路,以空間換時間
vector<int> pos(1001);
for(auto i:arr1) ++pos[i];
for(auto i:arr2) pos[i] *= -1;
int cur=0;
for(int i=0;i<arr2.size();++i){
while(pos[arr2[i]]<0){
arr1[cur++] = arr2[i];
++pos[arr2[i]];
}
}
for(int i =0;i<arr1.size();i++)
cout<<arr1[i]<<" ";
for(int i=0;i<pos.size();++i){
while(pos[i]>0){
arr1[cur++] = i;
--pos[i];
}
}
return arr1;
題號:1105(中等)
描述:動態規劃,記住已解出的子問題的最優解
思路: