语言:C++
今天一直在外边,晚上洗漱完补的题解
剑指 Offer 64. 求1+2+…+n
求 1+2+…+n ,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。
示例 1:
输入: n = 3
输出: 6
写了一个递归
递归注意事项:要有退出条件
class Solution
{
public:
int sumNums(int n)
{
if (n == 1)
return 1;
return n + sumNums(n - 1);
}
};
231. 2 的幂
给你一个整数 n,请你判断该整数是否是 2 的幂次方。如果是,返回 true ;否则,返回 false 。
如果存在一个整数 x 使得 n == 2^x ,则认为 n 是 2 的幂次方。
示例 1:
输入:n = 1
输出:true
解释:20 = 1
法一
特判n<=0的情况
2的幂有一个特点:二进制中只有一位为1
class Solution
{
public:
bool isPowerOfTwo(int n)
{
if (n <= 0)
return false;
int sum = 0;
while (n)
{
if (n & 1)
sum++;
n >>= 1;
}
return sum == 1 ? true : false;
}
};
法二
2的幂的特点:n&(n-1)==0
class Solution
{
public:
bool isPowerOfTwo(int n)
{
return n > 0 && (n & (n - 1)) == 0;
}
};
326. 3 的幂
给定一个整数,写一个函数来判断它是否是 3 的幂次方。如果是,返回 true ;否则,返回 false 。
整数 n 是 3 的幂次方需满足:存在整数 x 使得 n == 3x
示例 1:
输入:n = 27
输出:true
依旧是一个递归
这个递归比较特殊:(n % 3)==0?isPowerOfThree(n / 3):false;
当n%3==0时,才进行下一步递归,否则返回false
退出条件同上题
class Solution
{
public:
bool isPowerOfThree(int n)
{
if (n <= 0)
return false;
if (n == 1)
return true;
return (n % 3)==0?isPowerOfThree(n / 3):false;
}
};
342. 4的幂
给定一个整数,写一个函数来判断它是否是 4 的幂次方。如果是,返回 true ;否则,返回 false 。
整数 n 是 4 的幂次方需满足:存在整数 x 使得 n == 4x
示例 1:
输入:n = 16
输出:true
法一
直接套上一题的模板
class Solution
{
public:
bool isPowerOfFour(int n)
{
if (n <= 0)
return false;
if (n == 1)
return true;
return (n % 4) == 0 ? isPowerOfFour(n / 4) : false;
}
};
法二
在2的幂(法二)的基础上(4的幂也是2的幂)增加了一个条件n & 0xaaaaaaaa==0
0xaaaaaaaa格式是1010 1010 1010 1010(从右至左:偶数位为1)
4的幂是 (从右至左:奇数位为1) eg.1 100 10000
class Solution
{
public:
bool isPowerOfFour(int n)
{
return n > 0 && (n & (n - 1)) == 0 && (n & 0xaaaaaaaa) == 0;
}
};
1492. n 的第 k 个因子
给你两个正整数 n 和 k 。
如果正整数 i 满足 n % i == 0 ,那么我们就说正整数 i 是整数 n 的因子。
考虑整数 n 的所有因子,将它们 升序排列 。请你返回第 k 个因子。如果 n 的因子数少于 k ,请你返回 -1 。
示例 1:
输入:n = 12, k = 3
输出:3
解释:因子列表包括 [1, 2, 3, 4, 6, 12],第 3 个因子是 3 。
对于标记数k,每当n%i0,执行k–,当k0时,即此时的i为第k个因子
class Solution
{
public:
int kthFactor(int n, int k)
{
for (int i = 1; i <= n; i++)
{
if (n % i == 0)
{
k--;
}
if(k==0)
{
return i;
}
}
return -1;
}
};
367. 有效的完全平方数
给定一个 正整数 num ,编写一个函数,如果 num 是一个完全平方数,则返回 true ,否则返回 false 。
进阶:不要 使用任何内置的库函数,如 sqrt 。
示例 1:
输入:num = 16
输出:true
二分法查找完全平方数
注意:为了避免溢出,tmp取long类型
class Solution
{
public:
bool isPerfectSquare(int num)
{
int left = 1;
int right = num;
int mid;
long tmp;
while (left <= right)
{
mid = left + (right - left) / 2;
tmp =(long) mid * mid;
if (tmp == num)
return true;
else if (tmp > num)
right = mid - 1;
else
left = mid + 1;
}
return false;
}
};