【Leetcode -231. 2的幂 -242.有效的字母异位词 -258.各位相加】

2024-03-01 09:26:39 浏览数 (1)

Leetcode -231. 2的幂

题目:给你一个整数 n,请你判断该整数是否是 2 的幂次方。如果是,返回 true ;否则,返回 false 。 如果存在一个整数 x 使得 n == 2^x ,则认为 n 是 2 的幂次方。

示例: 输入:n = 1 输出:true 解释:20 = 1

  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;
		}
  1. 二进制表示

我们的思路是: 如果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;
		}

0 人点赞