题号 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(中等)
描述:动态规划,记住已解出的子问题的最优解
思路: