/*
解题思路:
如果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那么该序列就是顺子
}
};
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;
}
};