FRTKL

202. Happy Number (Easy)

Problem

https://leetcode.com/problems/happy-number/

  • 数値nが"happy" (happy number) かどうかを判定するアルゴリズムをかけ
  • happy numberは以下のプロセスによって定義された数値である
    1. 任意の正の整数から初める
    2. その数字をその数字の桁の2乗の和で置き換える
    3. その数字が1に等しくなるか、または1を含まずに無限ループするまで繰り替える
    4. この処理が1で終わる数をhappy numberとする
  • 関数は数値nがhappy numberであればtrueを、そうでなければfalseを返す

Solution

Go

func isHappy(n int) bool {
    seen := make(map[int]bool)

    for n != 1 {
        current := n
        sum := 0
        
        for current != 0 {
            sum += (current % 10) * (current % 10)
            current /= 10
        }
        
        if _, ok := seen[sum]; ok {
            return false
        }
        
        seen[sum] = true
        n = sum
    }
    
    return true
}

PHP

class Solution {

    /**
     * @param Integer $n
     * @return Boolean
     */
    function isHappy($n) {
        $seen = [];
        
        // $nが1でない間はループ
        while ($n !== 1) {
            $current = $n;
            $sum = 0;

            // 1桁ずつ2乗して足していく
            while ($current !== 0) {
                // 10で割ったときの余り = 一の位の値
                $sum += ($current % 10) ** 2;
                // 10で割る(intvalで小数点以下切り捨てつつ整数にキャスト) = 1桁下げる
                $current = intval($current / 10);
            }

            // 既に確認したことがある値だった場合はfalse
            if (in_array($sum, $seen, true)) {
                return false;
            }
            
            $seen[] = $sum;
            $n = $sum;
        }
        
        return true;
    }
}

Impression

  • LeetCode、SolutionsのところがPremium会員向けだった。なるほど、ここが課金ポイントなのか・・・わかる・・・。
  • 普通に難しくて自信なくした~
  • Go
    • "簡易文付きif"で既に計算したことのある値かチェックした
      • マップでこれまでに計算した値を持っておいて参照する。 if _, ok := map[1]; ok { みたいな書き方はGoのイディオムらしい。
  • PHP
    • 初めて累乗演算子使った気がする $sum += ($current % 10) ** 2
    • このPHPの回答 は数字を文字列にしてゴニョゴニョしてて(良し悪しは置いといて)PHPっぽいなと思った
Written By Fukuaki TAKANO
fortkle icon

Engineering Manager at Connehito inc.
Please contact me via twitter. @fortkle