LC-202这款产品有什么特别之处?
- 内容介绍
- 文章标签
- 相关推荐
本文共计774个文字,预计阅读时间需要4分钟。
编写一个算法来判断一个数+n+是否是快乐数。
快乐数定义为:对于一个正整数,每一次将它替换为它每一位数字的平方和,然后重复这个过程,如果最终结果变为1,则该数为快乐数。
例如,19是一个快乐数,因为:
1^2 + 9^2=82
8^2 + 2^2=68
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_sumslow, 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分钟。
编写一个算法来判断一个数+n+是否是快乐数。
快乐数定义为:对于一个正整数,每一次将它替换为它每一位数字的平方和,然后重复这个过程,如果最终结果变为1,则该数为快乐数。
例如,19是一个快乐数,因为:
1^2 + 9^2=82
8^2 + 2^2=68
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_sumslow, 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

