メインコンテンツへスキップ

NeetCode 150 [Math & Geometry]:easy

· loading · loading ·
kiitosu
著者
kiitosu
画像処理やデバイスドライバ、データ基盤構築からWebバックエンドまで、多様な領域に携わってきました。地図解析や地図アプリケーションの仕組みにも経験があり、幅広い技術を活かした開発に取り組んでいます。休日は草野球とランニングを楽しんでいます。
目次

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)でいけていいね。

Reply by Email

関連記事

NeetCode 150 [Linked List]: medium: Reorder List
· loading · loading
NeetCode 150 [Stack]:medium 5/5
· loading · loading
NeetCode 150 [Stack]:medium 1/5
· loading · loading