打卡 DAY 17 快乐数

该文介绍了一个计算整数n各位数字平方和的算法,用于判断是否为HappyNumber。当平方和为1时返回true,否则如果在计算过程中出现重复的平方和,表示进入死循环,返回false。文章提供了Java代码实现,并讨论了时间复杂度和空间复杂度,以及通过使用char*来优化内存的改进方案。
摘要由CSDN通过智能技术生成

一、题目描述

二、思路

计算n每个位置上数字的平方和sum,若是1,则return true;若重复出现过,代表进入了死循环,则return false;若不为以上情况则再次进入计算平方和。

三、解题过程

  • 先创造一个函数去计算sum

int getSum(int n) {
    int sum = 0;
    while(n){
        sum += (n % 10) * (n % 10);
        n /= 10;
    }
    return sum;
}
  • 初始化 sum 和 记录sum出现次数的数组 hash[810]

  • 因为n最大为十位数,而十个9的平方和为810,因此创造一个长度为810的数组去记录各个sum出现的次数:
    int sum = getSum( n );
    int hash[810] = { 0 };
  • 判断sum:是否为1或是否重复出现过

  • 每次循环都判断sun是否为1,且hash[sum]是否为0:若sum为1,则不再进入循环;若hash[sum]不为零,即sum重复出现过,则return false;若不属于上述两种情况,则继续更新sum的值:
    while(sum != 1) {
        if(hash[sum]) return false;
        hash[sum] ++;
        sum = getSum(sum);
    }

四、代码

int getSum(int n) {
    int sum = 0;
    while(n){
        sum += (n % 10) * (n % 10);
        n /= 10;
    }
    return sum;
}

bool isHappy(int n){
    int sum = getSum( n );
    int hash[810] = { 0 };
    while(sum != 1) {
        if(hash[sum]) return false;
        hash[sum] ++;
        sum = getSum(sum);
    }
    return true;
}

时间复杂度:O(n),空间复杂度:O(n)

五、改进

    char* hash = (int*)calloc(sizeof(int),820);
    //因为只存储0和1,一个字节就够了,则用char*可以节省内存
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值