代码日记:202. 快乐数

方法一:用哈希集合检测循环

  1. 创建一个哈希表(map)用于存储每次计算平方和的结果,以及记录是否出现循环。
  2. 定义一个循环,在循环中进行以下操作: 判断当前的数是否为1或者是否已经在哈希表中出现过,若是则直接返回对应的结果。
    将当前的数存储在哈希表中,标记为已经出现过。
  3. 根据题目要求,计算当前数每个位置上的数字的平方和,得到下一个数。
  4. 将下一个数作为当前数,继续进行判断和计算。
  5. 若循环结束后,当前数等于1,则返回true,表示这个数是快乐数;若当前数已经在哈希表中出现过,则返回false,表示这个数不是快乐数。

func isHappy(n int) bool {
	seen:=make(map[int]bool)
	for n!=1&&!seen[n]{
		seen[n]=true
		n=calculateSum(n)
	}
	return n==1
}

func calculateSum(n int) int{
	sum:=0
	for n>0{
		d:=n%10
		sum+=d*d
		n/=10
	}

	return sum
	}

方法二:快慢指针方法

  1. 我们使用快慢指针,快指针每次计算两次平方和,慢指针每次计算一次平方和。

  2. 在每一轮计算后,慢指针在平方和上前进一步,快指针在平方和上前进两步。

  3. 如果这个数是一个快乐数,那么这两个指针会相遇在1上;如果不是一个快乐数,那么它们最终会进入一个循环,这时候快的指针会追上慢的指针。

func isHappy1(n int) bool {
    slow, fast := n, n

    for {
        slow = calculateSum(slow)            // 慢指针每次计算一次
        fast = calculateSum(calculateSum(fast)) // 快指针每次计算两次

        if slow == 1 {
            return true
        }

        if slow == fast { // 如果快慢指针相遇,说明不是快乐数
            return false
        }
    }
}

// 计算每个位置上的数字的平方和
func calculateSum1(n int) int {
    sum := 0
    for n > 0 {
        digit := n % 10
        sum += digit * digit
        n /= 10
    }
    return sum
}
  • 11
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值