🤖

NeetCode 150 [Math & Geometry]:easy

2025/02/22に公開

NeetCodeのSolutionを書いていく

Happy Number

「非循環数」とは次のアルゴリズムで定義される整数です。

  • 整数が与えられ、それぞれの数字の2条を積算する。
  • 上記を繰り返し、1が得られたら終了する。あるいは1を含まないループを繰り返す。
  • 1で止まったらそれは非循環数です。

非循環数であればTrueを、循環数であればFalseを返します。
計算結果を記録しておけばいいだけか?結構簡単?

class Solution:
    calced: list[int] = []
    def calc(self, n) -> bool:
        strn = str(n)
        retval = 0
        for c in strn:
            retval += int(c) * int(c)
        if retval == 1:
            return True
        elif retval in self.calced:
            return False

        self.calced.append(retval)
        return self.calc(retval)

    def isHappy(self, n: int) -> bool:
        return self.calc(n)

行けない!?
なんだか、Runだとpassするんだけど、Submitすると通らない謎の現象が発生。

Runの場合

Submitの場合

わからん・・・
まあいいや。答えを見たところ、listよりsetのほうがin演算が早いことを学べた ✏️


Plus One

整数の配列digitsが与えられます。
それぞれ0番目が最も大きな桁、1番目が次、のように続きます。0が最初に来ることはありません。
1を足した結果を同様の整数配列で返してください。

Input: digits = [1,2,3,4]
Output: [1,2,3,5]

Input: digits = [9,9,9]
Output: [1,0,0,0]

これは、文字列を数字にキャストして、演算して、文字列に直せないかな?

class Solution:
    def plusOne(self, digits: list[int]) -> list[int]:
        snumber = ""
        len_digits = len(digits)
        for i in digits:
            digit = str(i)
            snumber += digit
        number = int(snumber) + 1
        snumber = str(number)
        digits = []
        for c in snumber:
            digits.append(int(c))
        return digits

いけたー。
でもなんの工夫もしていないな。
計算量はO(2n)?

回答だと一番下の桁が9かどうか判定して、9ではない場合は足すだけ。
9の場合は最後の桁を0に、最後の桁以外を使って再帰的に計算。
確かにこれだとO(n)でいけていいね。

Discussion