前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【Leetcode -231. 2的幂 -242.有效的字母异位词 -258.各位相加】

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

作者头像
YoungMLet
发布2024-03-01 09:26:39
1100
发布2024-03-01 09:26:39
举报
文章被收录于专栏:C++/Linux

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;
		}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-02-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Leetcode -231. 2的幂
  • Leetcode -242.有效的字母异位词
  • Leetcode - 258.各位相加
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档