- 32位有符号整数的取值范围是 [-2e31 , 2e31 -1 ];C++ 中的表示变量名为 [ INT_MIN, INT_MAX ]。
long a = x;
if ((int)a == a) //则表示a 在 [ INT_MIN, INT_MAX ]范围之内
else // 超出32位有符号整数的取值范围
- 26个字母的计数数组
举例:给定一个字符串,找到它的第一个不重复的字符,并返回它的索引。如果不存在,则返回 -1。
int firstUniqChar(string s) {
vector<int> count(26,0); // 26个字母的计数数组,小技巧
for (char c : s) count[c-'a'] ++;
for(int i = 0; i< s.size(); ++i) {
if(count[s[i]-'a']==1) return i;
}
return -1;
}
- 求一个数 n 是否是 给定数字 x 的 幂次方。
---- 换底公式
比如 求 n 是否是 3 的幂次方,也就是说 判定 n 是否等于 3^i 。
如果 n = 3^i, 那么 i = long3(n) 为整数。那么 log10(n)/log10(3) 必然也是整数。
则 :
bool isPowerOfThree(int n) {
double res = log10(n) / log10(3);
return res - floor(res) == 0;
}
注意以上另一个技巧,判断是否为整数 res - floor(res) == 0
,与 上文第1点钟的判断 a 在 [ INT_MIN, INT_MAX ]范围之内的方法类似。
floor(double n)
向下取整; ceil(double n)
向上取整。头文件为 cmath 或者 math.h
- STL 算法函数的运用
举例:如下题:输入一个非负整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。
class Solution {
public:
struct {
bool operator()(string s1, string s2) {
return s1+s2 < s2+s1;
}
} comp; // 仿函数
string minNumber(vector<int>& nums) {
int n = nums.size();
if(n==0) return "";
//if (n==0 || all_of(nums.begin(),nums.end(),[](int n) {return n==0;})) return "0";
vector<string> vstr(n);
transform(nums.begin(), nums.end(), vstr.begin(), [](int n) {return to_string(n);});
sort(vstr.begin(), vstr.end(), comp);
return accumulate(vstr.begin(), vstr.end(), string());
}
};