每日一题 Day6–leetcode202–快乐数

每日一题 Day6–leetcode202–快乐数

题目

链接:https://leetcode-cn.com/problems/happy-number/
链接为leetcode中文社区,题目没有区别,感觉很好用

题面描述:
编写一个算法来判断一个数 n 是不是快乐数。

快乐数」定义为:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和,然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。如果 可以变为 1,那么这个数就是快乐数。

如果 n 是快乐数就返回 True ;不是,则返回 False 。

示例:

输入:19
输出:true
解释:
12 + 92 = 82
82 + 22 = 68
62 + 82 = 100
12 + 02 + 02 = 1

解析+c语言实现

失败的暴力解法

按照题目描述,最容易想到的就是暴力求解,一直按规则计算直到得到1时返回true,出现循环时返回false,而在检测循环时采用数组标1/0的方法
于是,便有了以下的失败版本

bool isHappy(int n){//错误代码!
  int a[10000000];//开了一个数组记录
  memset(a,0,sizeof(a));
  int i,sum=0;
  a[n]=1;
  while(n!=0)  //循环
  {
​    sum=0;int p=n;while(p!=0)//按规则计算下一个数{
​      sum+=(p%10)*(p%10);
​      p=p/10;}if(sum==1) return true;if(a[sum]==1) return false;else a[sum]=1;
​    n=sum;
  }
  return false;
}

但是!问题来啦,当提交的时候出现错误:
每日一题 Day6–leetcode202–快乐数_第1张图片
意思为数组越界,但是当我加大数组大小时又出现错误:
每日一题 Day6–leetcode202–快乐数_第2张图片
错误为爆栈,数组内存过大或递归层数太深 ,总结下来 ,不能用数组记录是否出现循环,在c++或python或java里可以使用HashSet进行存储记录,详情参考:https://www.cnblogs.com/chanceYu/p/12808107.html

快慢指针

再次分析问题:
按照计算规则后这个数串只可能有三种走向

  • 走到1
  • 进入循环
  • 值会越来越大最后接近无穷

第一种即为所求true,第二种为false,对于第三种情况:

位数 最大值 下一位数
1 9 81
2 99 162
3 999 243
4 9999 324

如表格最后一行显示当位数大于4时,下一位数都会小于它,这说明这一串数字不会出现第三种情况——越来越大
而对于位数为3的数999的下一位是243,说明情况1和2的值都会小于243,所以在代码中并不需要处理第三种情况

总结下来,本题即判断链表是否有环的题
如有环,返回false
如没环,一条路走到1,返回 true;

快慢指针解法: 另两个指针从原点开始,沿链表往下跑,快指针每次跑两步,慢指针每次跑一步,快慢指针早晚会相遇,如果链表无环则相遇在终点1,如果有环则相遇在某一非1的点。

int next(int n)//自定义函数计算下一个数
{
  int sum=0;
  while(n!=0)
  {int p=n%10;
​    n=n/10;
​    sum+=p*p;
  }
  return sum;
}
bool isHappy(int n){
  int left=n,right=next(n);//快慢指针
  while(left!=right)
  {
​    left=next(left);
​    right=next(next(right));
  }
  if(left==1) return true;//如果相遇时点为1
  else return false;
}

执行结果:
每日一题 Day6–leetcode202–快乐数_第3张图片

关于每日一题

疫情在家学业不重,又觉得自己算法很薄弱,所以希望可以每天刷一道算法题。
在翻leetcode找题的时候看到了推出的每日1题打卡计划,觉得不错,在此写下来加深记忆,也希望可以帮到其他人 。

今天只写了c语言实现,最近在学习python和go,在复习java,过几天尝试不同语言实现。

Day6总结

leetcode202是一道 判断链表是否有环 的题,解法很有趣。

如果不出意外,每天这个时间更,欢迎监督,大家共勉。

欢迎关注公众号,日常同步博客内容,每日零点更新,前几天出去玩耽误了一下最近在每日三题补,欢迎监督。
每日一题 Day6–leetcode202–快乐数_第4张图片

你可能感兴趣的:(每日一题leetcode)