算法总结
1. 二分查找
对于数字运算,左移一位相当于乘以2,两位相当于乘以4,依次下去,右移相反是除以
public static int binarySearch(int[]A,int value) { int low = 0; int len = A.length; int high = len -1; while(low <= high) { int mid = (low + high)>>1; if(A[mid] == value) return mid; else if (A[mid] < value) low = mid +1; else high = mid -1; } return -1; }
二分查找易错的地方
- 循环退出的条件
注意是low <= high,而不是low<high.
- mid的取值
如果写成 mid (low+high)/2是有问题,如果low和high比较大,两者的和可能会溢出改进的方案low+(high-low)/2,但是计算机位运算比除法快,故可改成low+((high-low)>>1)
2. reverse(result.begin(),result.end())逆序
vector<int>(result.rbegin(),result.rend());逆序
3.find() 函数
本质上是一个模板函数,用于在指定范围内查找和目标元素值相等的第一个元素。
另外,该函数会返回一个输入迭代器,当 find() 函数查找成功时,其指向的是在 [first, last) 区域内查找到的第一个目标元素;如果查找失败,则该迭代器的指向和 last 相同。
4. distance() 函数用于计算两个迭代器表示的范围内包含元素的个数,返回个数
5.c++在string末尾添加字符或字符串
append函数
#include<iostream> using namespace std; int main() { string s1 = "1"; string s2 = "2"; string s3 = "0123456"; s1.append(s2); cout<<s1<<endl; s1.append(s3,3,6); cout<<s1<<endl; s1.append(5,'0'); cout<<s1<<endl; } //12 //123456 //12345600000
6.begin()和end()获取指针
7.重建二叉树(递归)
1、力扣上的一种解法
题目描述
好题 绝对的好题
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
需要首先熟悉二叉树先序遍历与中序遍历的规则。 先找到preorder中的起始元素作为根节点,在inorder中找到根节点的索引mid;那么,preorder[1:mid + 1]为左子树,preorder[mid + 1:]为右子树;inorder[0:mid]为左子树,inorder[mid + 1:]为右子树。递归建立二叉树。
TreeNode* reConstructBinaryTree(vector<int> pre,vector<int> vin) { if (pre.size() == 0 || vin.size() == 0) { return NULL; } TreeNode* treeNode = new TreeNode(pre[0]); int mid = distance(begin(vin), find(vin.begin(), vin.end(), pre[0])); vector<int> left_pre(pre.begin() + 1, pre.begin() + mid + 1); vector<int> right_pre(pre.begin() + mid + 1, pre.end()); vector<int> left_in(vin.begin(), vin.begin() + mid); vector<int> right_in(vin.begin() + mid + 1, vin.end()); treeNode->left = reConstructBinaryTree(left_pre, left_in); treeNode->right = reConstructBinaryTree(right_pre, right_in); return treeNode; }
8. bitset用法
主要是将 n 转化为 32位表示,int 最大也就是 2^32次方,然后利用bitset。count()函数,返回 其中 1 的数量
bitset<4> bitset1; //无参构造,长度为4,默认每一位为0
bitset<8> bitset2(12); //长度为8,二进制保存,前面用0补充 string s = "100101"; bitset<10> bitset3(s); //长度为10,前面用0补充 char s2[] = "10101"; bitset<13> bitset4(s2); //长度为13,前面用0补充 cout << bitset1 << endl; //0000 cout << bitset2 << endl; //00001100 cout << bitset3 << endl; //0000100101 cout << bitset4 << endl; //0000000010101 bitset<8> foo ("10011011"); cout << foo.count() << endl; //5 (count函数用来求bitset中1的位数,foo中共有5个1 cout << foo.size() << endl; //8 (size函数用来求bitset的大小,一共有8位 cout << foo.test(0) << endl; //true (test函数用来查下标处的元素是0还是1,并返回false或true,此处foo[0]为1,返回true cout << foo.test(2) << endl; //false (同理,foo[2]为0,返回false cout << foo.any() << endl; //true (any函数检查bitset中是否有1 cout << foo.none() << endl; //false (none函数检查bitset中是否没有1 cout << foo.all() << endl; //false (all函数检查bitset中是全部为1
9. C++ vector::assign()用法及代码示例
vector::assign()是C++中的STL,它通过替换旧元素为向量元素分配新值。如果需要,它也可以修改向量的大小。
分配常量值的语法:
vectorname.assign(int size, int value) Parameters:
- size -要分配的值数
- value -要分配给向量名称的值
程序1:下面的程序显示如何为向量分配常量值
// CPP program to demonstrate // how to assign constant values to a vector #include <bits/stdc++.h> using namespace std; int main() { vector<int> v; v.assign(7, 100); cout << "Size of first:" << int(v.size()) << '\n'; cout << "Elements are\n"; for (int i = 0; i < v.size(); i++) cout << v[i] << endl; return 0; } 输出: Size of first:7 Elements are 100 100 100 100 100 100 100
从数组或列表中分配值的语法:
vectorname.assign(arr, arr + size) Parameters: arr-要分配给向量的数组 size-必须从头开始分配的元素数。
程序2:下面的程序显示如何从数组或列表中分配值
// CPP program to demonstrate // how to assign values to a vector // from a list #include <bits/stdc++.h> using namespace std; int main() { vector<int> v1; int a[] = { 1, 2, 3 }; // assign first 2 values v1.assign(a, a + 2); cout << "Elements of vector1 are\n"; for (int i = 0; i < v1.size(); i++) cout << v1[i] << " "; vector<int> v2; // assign first 3 values v2.assign(a, a + 3); cout << "\nElements of vector2 are\n"; for (int i = 0; i < v2.size(); i++) cout << v2[i] << " "; return 0; } 输出: Elements of vector1 are 1 2 Elements of vector2 are 1 2 3
用于修改向量值的语法
vectorname.assign(InputIterator first, InputIterator last) Parameters: first -输入迭代器到初始位置范围。 last -输入迭代器到最终位置范围。
程序3:下面的程序显示了如何修改向量
// CPP program to demonstrate // how to modify vector size #include <bits/stdc++.h> using namespace std; int main() { vector<int> v; v.assign(7, 100); cout << "Size of first:" << int(v.size()) << '\n'; cout << "Elements are\n"; for (int i = 0; i < v.size(); i++) cout << v[i] << endl; // modify the elements v.assign(v.begin(), v.begin() + 3); cout << "\nModified VectorElements are\n"; for (int i = 0; i < v.size(); i++) cout << v[i] << endl; return 0; } 输出: Size of first:7 Elements are 100 100 100 100 100 100 100 Modified VectorElements are 100 100 100
10.C++中 &的位于运算判断一个数的奇偶性
操作格式
n1&n2
进行计算时,将会把类型提升为int
运算法则
在二进制数下,相同位的两个数字都为1,则为1;若有一个不为1,则为0。&运算通常用于二进制取位操作,例如一个数 & 1的结果就是取二进制的最末位。这可以用来判断一个整数的奇偶,二进制的最末位为0表示该数为偶数,最末位为1表示该数为奇数。
11.快慢指针

浙公网安备 33010602011771号