返回介绍

solution / 0200-0299 / 0202.Happy Number / README_EN

发布于 2024-06-17 01:04:03 字数 6444 浏览 0 评论 0 收藏 0

202. Happy Number

中文文档

Description

Write an algorithm to determine if a number n is happy.

A happy number is a number defined by the following process:

  • Starting with any positive integer, replace the number by the sum of the squares of its digits.
  • Repeat the process until the number equals 1 (where it will stay), or it loops endlessly in a cycle which does not include 1.
  • Those numbers for which this process ends in 1 are happy.

Return true _if_ n _is a happy number, and_ false _if not_.

 

Example 1:

Input: n = 19
Output: true
Explanation:
12 + 92 = 82
82 + 22 = 68
62 + 82 = 100
12 + 02 + 02 = 1

Example 2:

Input: n = 2
Output: false

 

Constraints:

  • 1 <= n <= 231 - 1

Solutions

Solution 1

class Solution:
  def isHappy(self, n: int) -> bool:
    vis = set()
    while n != 1 and n not in vis:
      vis.add(n)
      x = 0
      while n:
        n, v = divmod(n, 10)
        x += v * v
      n = x
    return n == 1
class Solution {
  public boolean isHappy(int n) {
    Set<Integer> vis = new HashSet<>();
    while (n != 1 && !vis.contains(n)) {
      vis.add(n);
      int x = 0;
      while (n != 0) {
        x += (n % 10) * (n % 10);
        n /= 10;
      }
      n = x;
    }
    return n == 1;
  }
}
class Solution {
public:
  bool isHappy(int n) {
    unordered_set<int> vis;
    while (n != 1 && !vis.count(n)) {
      vis.insert(n);
      int x = 0;
      for (; n; n /= 10) {
        x += (n % 10) * (n % 10);
      }
      n = x;
    }
    return n == 1;
  }
};
func isHappy(n int) bool {
  vis := map[int]bool{}
  for n != 1 && !vis[n] {
    vis[n] = true
    x := 0
    for ; n > 0; n /= 10 {
      x += (n % 10) * (n % 10)
    }
    n = x
  }
  return n == 1
}
function isHappy(n: number): boolean {
  const getNext = (n: number) => {
    let res = 0;
    while (n !== 0) {
      res += (n % 10) ** 2;
      n = Math.floor(n / 10);
    }
    return res;
  };
  const set = new Set();
  while (n !== 1) {
    const next = getNext(n);
    if (set.has(next)) {
      return false;
    }
    set.add(next);
    n = next;
  }
  return true;
}
use std::collections::HashSet;
impl Solution {
  fn get_next(mut n: i32) -> i32 {
    let mut res = 0;
    while n != 0 {
      res += (n % 10).pow(2);
      n /= 10;
    }
    res
  }

  pub fn is_happy(mut n: i32) -> bool {
    let mut set = HashSet::new();
    while n != 1 {
      let next = Self::get_next(n);
      if set.contains(&next) {
        return false;
      }
      set.insert(next);
      n = next;
    }
    true
  }
}
int getNext(int n) {
  int res = 0;
  while (n) {
    res += (n % 10) * (n % 10);
    n /= 10;
  }
  return res;
}

bool isHappy(int n) {
  int slow = n;
  int fast = getNext(n);
  while (slow != fast) {
    slow = getNext(slow);
    fast = getNext(getNext(fast));
  }
  return fast == 1;
}

Solution 2

class Solution:
  def isHappy(self, n: int) -> bool:
    def next(x):
      y = 0
      while x:
        x, v = divmod(x, 10)
        y += v * v
      return y

    slow, fast = n, next(n)
    while slow != fast:
      slow, fast = next(slow), next(next(fast))
    return slow == 1
class Solution {
  public boolean isHappy(int n) {
    int slow = n, fast = next(n);
    while (slow != fast) {
      slow = next(slow);
      fast = next(next(fast));
    }
    return slow == 1;
  }

  private int next(int x) {
    int y = 0;
    for (; x > 0; x /= 10) {
      y += (x % 10) * (x % 10);
    }
    return y;
  }
}
class Solution {
public:
  bool isHappy(int n) {
    auto next = [](int x) {
      int y = 0;
      for (; x; x /= 10) {
        y += pow(x % 10, 2);
      }
      return y;
    };
    int slow = n, fast = next(n);
    while (slow != fast) {
      slow = next(slow);
      fast = next(next(fast));
    }
    return slow == 1;
  }
};
func isHappy(n int) bool {
  next := func(x int) (y int) {
    for ; x > 0; x /= 10 {
      y += (x % 10) * (x % 10)
    }
    return
  }
  slow, fast := n, next(n)
  for slow != fast {
    slow = next(slow)
    fast = next(next(fast))
  }
  return slow == 1
}
function isHappy(n: number): boolean {
  const getNext = (n: number) => {
    let res = 0;
    while (n !== 0) {
      res += (n % 10) ** 2;
      n = Math.floor(n / 10);
    }
    return res;
  };

  let slow = n;
  let fast = getNext(n);
  while (slow !== fast) {
    slow = getNext(slow);
    fast = getNext(getNext(fast));
  }
  return fast === 1;
}
impl Solution {
  pub fn is_happy(n: i32) -> bool {
    let get_next = |mut n: i32| {
      let mut res = 0;
      while n != 0 {
        res += (n % 10).pow(2);
        n /= 10;
      }
      res
    };
    let mut slow = n;
    let mut fast = get_next(n);
    while slow != fast {
      slow = get_next(slow);
      fast = get_next(get_next(fast));
    }
    slow == 1
  }
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文