第一题
首先,看特殊数字 0 反转两次为零,即num == 0 应返回true
此外,反转两次得到原数字,说明符合要求的数字反转后位数不能改变,也即末尾没不应有零,即num % == 0 应返回false;
class Solution {
public:
bool isSameAfterReversals(int num) {
return !num || num % 10;
}
};
第二题
首先,考虑特殊数字 n 为 2 的幂次方 ,必须应当大于等于零,因此当 n 小于等于零时应返回false
此外,当 n 为 1 时,是 2 的零次方,返回true
另外,当 n 为奇数是必然不肯能是 2 的幂次方, 即 num % 2 == 1;返回 false
最后,通过枚举 2 的所有幂,如出现num值则返回true
注意: k 值应当定义成无符号整型,否则当 i = 31 是会溢出
警告:整型的位数是32位,-231 <= n <= 231 - 1
class Solution {
public:
bool isPowerOfTwo(int n) {
if(n <= 0){
return false;
}
if(n == 1)
return true;
if(n % 2 == 1){
return false;
}
int unsigned k = 1;
int i;
for(i = 0; i <= 31; i++)
{
k *= 2;
if(k == n){
return true;
}
}
return false;
}
};
第三题
首 先,直接忽略条件算一波,但是注意上下界从 1 开始 到 target 结束 包含 target
第二种方法 是利用递归 ,但不允许使用选择语句和三目运算符,考虑使用逻辑运算符模拟短路
递归思路:要算1 累加到 target 可以先算 target + (target - 1),建立递归表达式,然后注意递归截止的条件 target 为零时开始 逆序返回 target += 0; target += 1 + 0; ………… target += (target - 1)+ ……+ 1 + 0;
class Solution {
public:
int mechanicalAccumulator(int target) {
int sum = 0;
// for(int i = 1; i <= target; i++)
// {
// sum += i;
// }
// return sum;
target && (target += mechanicalAccumulator(target -1));
return target;
}
};
第四题
class Solution {
public:
int kthFactor(int n, int k) {
int cnt = 0;//定义一个计数器
for(int i = 1; i <= n; i++)// n 为正整数 0 不可能为其因子,从 1 开始,最大为其自身[1, n];
{
if(n % i == 0)// 如果为真表示 i 是 n 的因子
cnt++;
if(k == cnt)
return i;
}
return -1;//如果没有累加至 k 返回 -1
}
};
第五题
class Solution {
public:
bool isPerfectSquare(int num) {
// //偏要使用库函数
// int x = (int)sqrt(num);
// return x * x == num;//如果开根号取整后,乘积仍为原数,则是完全平方数
// //暴力枚举
// long long n;
// int i;
// for(i = 1;i <= num ; i++){//枚举所有整数的平方,缩小范围 i ∈[1, num]
// n = (long long) i * i;//将 n 定义为 long long 防止32位整型溢出
// if(n == num)
// return true;
// if(n > num)
// return false;
// }
// return false;
//二分查找
//缩小范围 i ∈[1, num)
int left = 0;
int right = num;
while(left <= right)//终止条件left > right
{
int mid = (right + left) / 2;
long long square = (long long) mid * mid; //防止溢出
if(square < num) //如果中间值平方小于num说明在右区间,需要调整左端点的值
{
left = mid + 1;
}
else if(square > num)//如果中间值平方大于num说明在右区间,需要调整右端点的值
{
right = mid - 1;
}
else
{
return true;
}
}
return false;
}
};