Leetcode -231. 2的幂
题目:给你一个整数 n,请你判断该整数是否是 2 的幂次方。如果是,返回 true ;否则,返回 false 。 如果存在一个整数 x 使得 n == 2^x ,则认为 n 是 2 的幂次方。
示例: 输入:n = 1 输出:true 解释:20 = 1
- 暴力循环求解
我们的思路是,因为n的范围是:2^-31<=n<=2 ^ 31,所以遍历一次i从0到31,只要n等于2的i次方,就返回true;否则返回false;
代码语言:javascript复制 bool isPowerOfTwo(int n)
{
for (int i = 0; i <= 31; i )
{
if (n == pow(2, i))
{
return true;
}
}
return false;
}
- 二进制表示
我们的思路是: 如果n是2的幂,那么它的二进制表示肯定是只有一个1,1后面全是0,那么我们将n-1,那么它原来的1变成0,这个0后面全变成1;所以将这两个数按位与,肯定是0;不是0的话肯定不是2的幂;并且n需要大于0,这两个条件其中一个不满足都返回false
代码语言:javascript复制 bool isPowerOfTwo(int n)
{
return n > 0 && (n & (n - 1)) == 0;
}
Leetcode -242.有效的字母异位词
题目:给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。 注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。
示例: 输入: s = “anagram”, t = “nagaram” 输出 : true
提示: 1 <= s.length, t.length <= 5 * 104 s 和 t 仅包含小写字母
我们的思路是,初始化两个数组为0,将字符串中的字母作为数组的下标,每次这个字母作为下标进入数组的时候,这个字母对应下标的元素就 一次;另一个字符串则存入另一个数组;最后遍历一次26个字母当中,以它们作为下标的元素是否相等;
代码语言:javascript复制 bool isAnagram(char* s, char* t)
{
//创建两个哈希表
//因为s 和 t 仅包含小写字母,字符串中的小写字母的最大为z,对应的十进制数为122
//数组开辟的大小是0-122,即为123
int hash1[123] = { 0 };
int hash2[123] = { 0 };
//将s字符串中的字符作为下标存到哈希表中,每次存进来都
for (int i = 0; i < strlen(s); i )
{
hash1[s[i]] ;
}
//将t字符串中的字符作为下标存到哈希表中,每次存进来都
for (int i = 0; i < strlen(t); i )
{
hash2[t[i]] ;
}
//遍历一次小写字母当中,以它们对应的字母为下标的元素中,是否相等
//不相等说明它们的相同的字母数不相等,返回false
for (char j = 'a'; j < 'z'; j )
{
if (hash1[j] != hash2[j])
{
return false;
}
}
//遍历完没有返回说明都相等,返回true
return true;
}
以上的思路的代码可以更美观:
代码语言:javascript复制 bool isAnagram(char* s, char* t)
{
//字符串长度不相等返回false
if (strlen(s) != strlen(t))
{
return false;
}
int hash[26] = { 0 };
//以s[i]为下标的字母存进去一次就 一次
for (int i = 0; i < strlen(s); i )
{
hash[s[i] - 'a'] ;
}
//以t[i]为下标的字母存进去一次就--一次
//如果是相同字母的话,即s[i] == t[i],hash[s[i]]和hash[t[i]]找到的是同一个数组中的元素
for (int i = 0; i < strlen(t); i )
{
hash[t[i] - 'a']--;
//当出现负数,即两个字符串相同的字母不相等,返回false
if (hash[t[i] - 'a'] < 0)
{
return false;
}
}
return true;
}
Leetcode - 258.各位相加
题目:给定一个非负整数 num,反复将各个位上的数字相加,直到结果为一位数。返回这个结果。
示例: 输入: num = 38 输出 : 2
解释 : 各位相加的过程为: 38 – > 3 8 – > 11 11 – > 1 1 – > 2 由于 2 是一位数,所以返回 2。
我们的思路是两层循环,外层循环判读n是否还是两位数,里层循环将两位数以上的数的各位相加起来;
代码语言:javascript复制 int addDigits(int num)
{
while (num > 9)
{
int sum = 0;
while (num)
{
sum = num % 10;
num /= 10;
}
num = sum;
}
return num;
}