[TOC]

一、扑克牌相关

剑指 Offer 61. 扑克牌中的顺子(简单难度)

class Solution {
public:
    /*解析:本题要求判断一个5个元素的数组是否是顺子
    稍微思考下,明白首先要从小到大排序,然后判断是否有除0以外的重复数,有则肯定不是顺子
    难点在于0可以看做然后数来填补顺子,如何判断几张0填补顺子是算法的难点?
    解决方案:找到minVal(非0)和maxVal,通过maxVal-minVal的差来判断需要几张0填补
    */
    bool isStraight(vector<int>& nums) {
        int zeroCnt=0;//0的数组
        int n=nums.size();//此题固定为5
        sort(nums.begin(),nums.end());//从小到大排序
        // 遍历数组,记录0的个数并判断是否存在重复数
        for(int i=0;i<n;i++){
            if(nums[i]==0)zeroCnt++;
            else if(i+1<n&&nums[i]==nums[i+1]) return false;
        }
        // maxVal-minVal<5时必定可以
        return nums[n-1]-nums[zeroCnt]<5;
    }
};

二、字符串转整数

剑指 Offer 67. 把字符串转换成整数(中等难度)

8. 字符串转换整数 (atoi)(中等难度)

class Solution {
public:
    /*本题是要将字符串转为有符号的32位整数。
    根据示例,字符串可能存在前端空格、正负号、后缀字母、首字符非数字、数字越界共计5种情况,
    这也是本题的难点
    */
    bool isDigit(char c){
        return c-'0'>=0&&c-'0'<=9;
    }
    int strToInt(string str) {
        int n=str.length();
        if(n==0) return 0;//非有效转换输出0
        int start=0;
        int negative=false;
        // 去掉前端空格
        for(char c:str){
            if(c==' ') start++;
            else break;
        }
        if(start==n)return 0;//去掉前导空格后到了末尾
        // // 判断非空首字符
        if (str[start] == '-') {
            negative = true;
            start++;
        }
        else if (str[start] == '+') 
        {
            negative = false;
            start++;
        }
        else if (!isDigit(str[start])){
            return 0;//非数字
        } 
        // 判断
        int ans = 0;
        while (start < n && isDigit(str[start])) {
            int digit = str[start] - '0';
            if (ans > (INT_MAX - digit) / 10) {
                // 本来应该是 ans * 10 + digit > Integer.MAX_VALUE
                // 但是 *10 和 + digit 都有可能越界,所有都移动到右边去就可以了。
                return negative? INT_MIN : INT_MAX;
            }
            ans = ans * 10 + digit;
            start++;
        }
        return negative? -ans : ans;
    }
};