LC-202这款产品有什么特别之处?

2026-05-17 03:071阅读0评论SEO问题
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计774个文字,预计阅读时间需要4分钟。

LC-202这款产品有什么特别之处?

编写一个算法来判断一个数+n+是否是快乐数。

快乐数定义为:对于一个正整数,每一次将它替换为它每一位数字的平方和,然后重复这个过程,如果最终结果变为1,则该数为快乐数。

例如,19是一个快乐数,因为:

1^2 + 9^2=82

8^2 + 2^2=68

LC-202这款产品有什么特别之处?

6^2 + 8^2=100

1^2 + 0^2 + 0^2=1

因此,编写算法如下:

python

def is_happy_number(n): def get_next(n): total_sum=0 while n > 0: n, digit=divmod(n, 10) total_sum +=digit ** 2 return total_sum

slow, fast=n, get_next(n) while fast !=1 and slow !=fast: slow=get_next(slow) fast=get_next(get_next(fast))

return fast==1

示例print(is_happy_number(19)) # 输出:True

编写一个算法来判断一个数 n 是不是快乐数。

「快乐数」 定义为:

  • 对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。
  • 然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。
  • 如果这个过程 结果为 1,那么这个数就是快乐数。
  • 如果 n 是 快乐数 就返回 true ;不是,则返回 false 。

示例 1:

提示:

1 <= n <= 231 - 1

来源:力扣(LeetCode)
链接:leetcode-cn.com/problems/happy-number
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。


通过反复调用 getNext(n) 得到的链是一个隐式的链表。隐式意味着我们没有实际的链表节点和指针,但数据仍然形成链表结构。

这一题并没有看出来是一个隐式链表,所以没有往双指针的思路去考虑。

Java实现

class Solution { public int getNext(int n) { int totalSum = 0; while (n > 0) { int d = n % 10; n = n / 10; totalSum += d * d; } return totalSum; } public boolean isHappy(int n) { int slowRunner = n; int fastRunner = getNext(n); //如果给定的数字最后会一直循环重复,那么快的指针(值)一定会追上慢的指针(值), //也就是两者一定会相等。如果没有循环重复,那么最后快慢指针也会相等,且都等于1。 while (fastRunner != 1 && slowRunner != fastRunner) { slowRunner = getNext(slowRunner); fastRunner = getNext(getNext(fastRunner)); } return fastRunner == 1; } }

Python实现

def isHappy(self, n: int) -> bool: def get_next(number): total_sum = 0 while number > 0: number, digit = divmod(number, 10) total_sum += digit ** 2 return total_sum slow_runner = n fast_runner = get_next(n) while fast_runner != 1 and slow_runner != fast_runner: slow_runner = get_next(slow_runner) fast_runner = get_next(get_next(fast_runner)) return fast_runner == 1

Hash

def isHappy(self, n: int) -> bool: def get_next(n): total_sum = 0 while n > 0: n, digit = divmod(n, 10) total_sum += digit ** 2 return total_sum seen = set() while n != 1 and n not in seen: seen.add(n) n = get_next(n) return n == 1

本文共计774个文字,预计阅读时间需要4分钟。

LC-202这款产品有什么特别之处?

编写一个算法来判断一个数+n+是否是快乐数。

快乐数定义为:对于一个正整数,每一次将它替换为它每一位数字的平方和,然后重复这个过程,如果最终结果变为1,则该数为快乐数。

例如,19是一个快乐数,因为:

1^2 + 9^2=82

8^2 + 2^2=68

LC-202这款产品有什么特别之处?

6^2 + 8^2=100

1^2 + 0^2 + 0^2=1

因此,编写算法如下:

python

def is_happy_number(n): def get_next(n): total_sum=0 while n > 0: n, digit=divmod(n, 10) total_sum +=digit ** 2 return total_sum

slow, fast=n, get_next(n) while fast !=1 and slow !=fast: slow=get_next(slow) fast=get_next(get_next(fast))

return fast==1

示例print(is_happy_number(19)) # 输出:True

编写一个算法来判断一个数 n 是不是快乐数。

「快乐数」 定义为:

  • 对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。
  • 然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。
  • 如果这个过程 结果为 1,那么这个数就是快乐数。
  • 如果 n 是 快乐数 就返回 true ;不是,则返回 false 。

示例 1:

提示:

1 <= n <= 231 - 1

来源:力扣(LeetCode)
链接:leetcode-cn.com/problems/happy-number
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。


通过反复调用 getNext(n) 得到的链是一个隐式的链表。隐式意味着我们没有实际的链表节点和指针,但数据仍然形成链表结构。

这一题并没有看出来是一个隐式链表,所以没有往双指针的思路去考虑。

Java实现

class Solution { public int getNext(int n) { int totalSum = 0; while (n > 0) { int d = n % 10; n = n / 10; totalSum += d * d; } return totalSum; } public boolean isHappy(int n) { int slowRunner = n; int fastRunner = getNext(n); //如果给定的数字最后会一直循环重复,那么快的指针(值)一定会追上慢的指针(值), //也就是两者一定会相等。如果没有循环重复,那么最后快慢指针也会相等,且都等于1。 while (fastRunner != 1 && slowRunner != fastRunner) { slowRunner = getNext(slowRunner); fastRunner = getNext(getNext(fastRunner)); } return fastRunner == 1; } }

Python实现

def isHappy(self, n: int) -> bool: def get_next(number): total_sum = 0 while number > 0: number, digit = divmod(number, 10) total_sum += digit ** 2 return total_sum slow_runner = n fast_runner = get_next(n) while fast_runner != 1 and slow_runner != fast_runner: slow_runner = get_next(slow_runner) fast_runner = get_next(get_next(fast_runner)) return fast_runner == 1

Hash

def isHappy(self, n: int) -> bool: def get_next(n): total_sum = 0 while n > 0: n, digit = divmod(n, 10) total_sum += digit ** 2 return total_sum seen = set() while n != 1 and n not in seen: seen.add(n) n = get_next(n) return n == 1