to_string函数,这是C++11新增的:C++11标准增加了全局函数std::to_string,以及std::stoi/stol/stoll等等函数(这几个就是string转int,long,以及long long啦~)
to_string这个函数还是很强大的!
string to_string (int val);
string to_string (long val);
string to_string (long long val);
string to_string (unsigned val);
string to_string (unsigned long val);
string to_string (unsigned long long val);
string to_string (float val);
string to_string (double val);
string to_string (long double val);
可以直接转换成string类,判断回文数
bool isPalindrome(int x){
bool mid=0;
if(x<0||x%10==0&&x!=0) return false;//负数/末尾为0直接判错
while(x>mid){
mid=mid*10+x%10;
x/=10;
}
return mid==x||mid/10==x;//奇/偶两种情况
}
利用str.find()==0判断该子串是否为前缀
str.find()==string::npos 判断是否存在该子串
str.find()==0 判断位置是否为0
不用开矩阵vis[50][50],DFS时可以直接将遍历过的顶点值设为0,节省空间
注意gird.size()和grid[0].size()分别对应的是x/y
字符串反转
reverse(str.begin(),str.end())
提升时间复杂度:
l2长度小于l1长度时,必定需要判错
巧妙利用截断,不用将k转换成vector
代码思路如下:
vector<int> addToArrayForm(vector<int>& A, int K) {
vector<int> result;
int lastNum=K,i=A.size()-1;
while(i>=0||lastNum>0)
{
//对应位相加
if(i>=0)lastNum+=A[i--];
//尾部数字添加到result中,同时k需要丢弃尾部数字
result.push_back(lastNum%10);
lastNum/=10;
}
//注意:要反转,因为低位数字都排在数组的前面了,所以需要反转
reverse(result.begin(),result.end());
return result;
}
错误情况:
Line x: member access within null pointer of type 'struct TreeNode'
原因:在测试过程中,第x行访问的指针为NULL,通常情况下表明程序未对NULL情况作出判断。
区间和可以转换成求差的问题,求差问题,也可以转换成区间和的问题。
即:
原数组两个元素的最大差等于求差数组的最大子序和!!!
利用内置函数+双指针
islower(char)是否为小写
isupper(char)是否为大写
isdigit(char)是否为数字
isalpha(char)是否为字母
isalnum(char)是否为数字/字母
toupper(char)字母小转大
tolower(char)字母大转小
运用位运算
一个数和 0 做 XOR 运算等于本身: a⊕0 = a
一个数和其本身做 XOR 运算等于 0: a⊕a = 0
XOR 运算满足交换律和结合律: a⊕b⊕a = (a⊕a)⊕b = 0⊕b = b
int res = 0;
for(int i=0;i<len;i++){
res ^= nums[i]; //与每一个数字进行异或运算
}
return res;
vector(int nSize) 创建一个vector,元素个数为nSize
vector(int nSize,const t& t) 创建一个vector,元素个数为nSize,且值均为t
vector(const vector&) 复制构造函数
vector(begin,end) 复制[begin,end)区间内另一个数组的元素到vector中
二分法时:
int mid = (l+h)/2 ;可能会有溢出的问题
采用:
int mid = l + (h-l)/2; 避免产生溢出
假设给定字符串s可由一个子串x重复n次构成,即s=nx。 emplace_back() 和 push_back() 的区别,就在于底层实现的机制不同。push_back() 向容器尾部添加元素时,首先会创建这个元素,然后再将这个元素拷贝或者移动到容器中(如果是拷贝的话,事后会自行销毁先前创建的这个元素);而 emplace_back() 在实现时,则是直接在容器尾部创建这个元素,省去了拷贝或移动元素的过程。 ⚠️后者比前者快一倍以上
现构造新字符串t=2s,即两个s相加,由于s=nx,则t=2nx。
去掉t的开头与结尾两位,则这两处的子串被破坏掉,此时t中包含2n-2个子串。
由于t中包含2n-2个子串,s中包含n个子串,若t中包含s,则有2n-2>=n,可得n>=2,由此我们可知字符串s可由一个子串x重复至少2次构成,判定为true;反之,若t中不包含s,则有2n-2vector push_back 和 emplace_back