Leetcode 刷题易错点 & 小技巧

  1. 32位有符号整数的取值范围是 [-2e31 , 2e31 -1 ];C++ 中的表示变量名为 [ INT_MIN, INT_MAX ]。
long a = x;
if ((int)a == a) //则表示a 在 [ INT_MIN, INT_MAX ]范围之内
else // 超出32位有符号整数的取值范围
  1. 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;
    }
  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

  1. 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());
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值