剑指offer每日一题【扑克牌中的顺子、1 + 2 + .. N、数值的整数次方】

在这里插入图片描述
扑克牌中的顺子.

/*
    解题思路:
    如果nums中存在重复的值那么肯定不是顺子,可以利用set的性质不会包含重复的key值,insert接口函数插入
    失败会返回pair对象,pair::second会被设置为false,利用这个特性筛选出来所有重复的序列把他pass掉
    大小王是可以表示任意数字的所以遇到大小王就直接忽略跳过,在不断将值插入到set容器中选出最大值和最小
    值,如果最大小减去最小值的结果小于5那么这个序列就是顺子

*/

class Solution {
public:
    bool isStraight(vector<int>& nums) {

        set<int> s;
        int maxi = -1,  mini = 14;
        for(auto &ref : nums)
        {
            if(ref == 0) continue;//遇到大小王就跳过
            if((s.insert(ref)).second == false ) return false;  
            //如果遇到重复包含的值那么就 返回 false
            s.insert(ref) ;
            maxi = max(maxi, ref);  //记录最大牌
            mini = min(mini, ref);  //记录最小牌

        }
        return maxi - mini < 5;  //如果最大值减去最小值的结果小于5那么该序列就是顺子
    }
};

在这里插入图片描述
求1+2+…+n.

class Solution {
public:
    int sumNums(int n) {
        char t[n][n+1]; //char是一字节 , n = 10  n * n+1 = 110
        return sizeof(t)>>1; //110字节/ 2 = 55 , ok
    }
};

递归写法

class Solution {
public:
    int sumNums(int n) {
       int ans = n;
       n > 0 && (ans += sumNums(n - 1)); //利用短路与的性质递归计算
      return ans;  
    }
};

在这里插入图片描述

数值的整数次方.

class Solution {
public:
    double myPow(double x, int n) {
       double ans = 1;
        for(long k = abs(long(n)); k > 0; k >>= 1) //防止溢出的做法是做整形提升
        {
            if(k & 1) ans *= x; //k为奇数时会多出来一个乘项x
             x *= x;
        }
             
        if(n < 0) ans = 1 / ans; //考虑n为负数的情况
        return ans;
    }   
};
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱生活,爱代码

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值