Leetcode -342. 4的幂
题目:给定一个整数,写一个函数来判断它是否是 4 的幂次方。如果是,返回 true ;否则,返回 false 。
整数 n 是 4 的幂次方需满足:存在整数 x 使得 n == 4x
示例 1:
输入:n = 16
输出:true
示例 2:
输入:n = 5
输出:false
示例 3:
输入:n = 1
输出:true
提示:
- 2^31 <= n <= 2^31 - 1
- 循环法
循环法的思路是,将n一直取余数,如果不为0,则说明不是4的幂,跳出循环,返回false;若为0,则取n的商,继续进入循环判断;直到n一直取商后取余不为0,或者最后n变成1;n变成1之后,则说明n是4的幂;
bool isPowerOfFour(int n) { if (n <= 0) return false; while (!(n % 4)) n /= 4; if (n == 1) return true; else return false; }
- 二进制表示中 1 的位置
我们的思路是,4的幂二进制中,1都是在偶数位上,其他都是0,所以如果是4的幂,按位与上0xaaaaaaaa,结果就是0;但在这个条件之前的前提是n>0并且n是2的幂;
bool isPowerOfFour(int n) { //首先大于0;并且满足是2的幂;最后按位与上所有偶数二进制位都是 0,所有奇数二进制位都是1的数,即十六进制的0xaaaaaaaa //4的幂二进制数中,1都是在偶数位上,其他都是0,所以如果是4的幂,按位与上0xaaaaaaaa,结果就是0 return n > 0 && (n & (n - 1)) == 0 && (n & 0xaaaaaaaa) == 0; }
Leetcode -344.反转字符串
题目:编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。
不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。
示例:
输入:s = [“h”, “e”, “l”, “l”, “o”]
输出:[“o”, “l”, “l”, “e”, “h”]
我们的思路是双指针,左指针下标从0开始,右指针下标从数组长度-1开始遍历,每交换一次左指针++,右指针- -,直到左指针大于右指针;
void reverseString(char* s, int sSize) { //左指针下标从0开始,右指针下标从数组长度-1开始 int left = 0, right = sSize - 1; //当左指针比右指针的值小,循环继续 while (left < right) { char tmp = s[left]; s[left] = s[right]; s[right] = tmp; left++; right--; } }
Leetcode -345.反转字符串中的元音字母
题目:给你一个字符串 s ,仅反转字符串中的所有元音字母,并返回结果字符串。
元音字母包括 ‘a’、‘e’、‘i’、‘o’、‘u’,且可能以大小写两种形式出现不止一次。
示例 1:
输入:s = “hello”
输出:“holle”
示例 2:
输入:s = “leetcode”
输出:“leotcede”
我们的思路是双指针,左指针下标从0开始,右指针下标从数组长度-1开始,两个指针都从两边开始找元音字母,两个都找到就交换,否则继续找;
bool isvowel(char ch) { //创建一个元音字母的数组 char vowel[] = "aeiouAEIOU"; //遍历元音字母的数组 for (int i = 0; vowel[i]; i++) { if (ch == vowel[i]) { //找到返回true return true; } } //否则返回false return false; } char* reverseVowels(char* s) { //左指针下标从0开始,右指针下标从数组长度-1开始 int left = 0, right = strlen(s) - 1; //当左指针比右指针的值小,循环继续 while (left < right) { //左指针找元音字母,左指针要在数组长度范围内找 //进入isvowel函数判断是否元音字母, //若返回true证明是元音字母,取非,变成false,就跳出循环; //即找到元音字母就跳出循环,否则继续找; while (left < strlen(s) && !isvowel(s[left])) { left++; } //右指针同理 while (right > 0 && !isvowel(s[right])) { right--; } //当左指针比右指针值小时,交换 if (left < right) { char tmp = s[left]; s[left] = s[right]; s[right] = tmp; left++; right--; } } return s; }