leetcode -- 258、263

258.各位相加

题目描述

给定一个非负整数 num,反复将各个位上的数字相加,直到结果为一位数。

示例:

输入: 38
输出: 2
解释: 各位相加的过程为:3 + 8 = 11, 1 + 1 = 2。 由于 2 是一位数,所以返回 2。

进阶:
你可以不使用循环或者递归,且在 O(1) 时间复杂度内解决这个问题吗?

解题方法

看到后面的进阶,我就知道这是个数学题,又得被评论大佬秀一脸了。果不其然。

方法一:循环

嗯,就是我这个菜鸡用的方法

int addDigits(int num)
{
    int sum = 0;
    while (num / 10)       // 一位数
    {
        sum = 0;
        while (num)
        {
            sum += num % 10;
            num /= 10;
        }
        num = sum;
    }
    return num;
}

4ms,超过70+%

方法二:大佬方法

int addDigits(int num)
{
    return (num - 1) % 9 + 1;
}

在这里插入图片描述
牛逼
解释:点这里

263.丑数

编写一个程序判断给定的数是否为丑数。
丑数就是只包含质因数 2, 3, 5 的正整数。

示例 1:

输入: 6
输出: true
解释: 6 = 2 × 3

示例 2:

输入: 8
输出: true
解释: 8 = 2 × 2 × 2

示例 3:

输入: 14
输出: false
解释: 14 不是丑数,因为它包含了另外一个质因数 7。

说明:

  • 1 是丑数。
  • 输入不会超过 32 位有符号整数的范围: [−231, 231 − 1]

解题方法

将一个数不断除以2、3、5,如果某时刻不能整除了,并且这个数不是1,则不是丑数。

bool isUgly(int num)
{
    if (num == 0)
        return false;
    while (num)
    {
        printf("num = %d\n", num);
        if (num == 1)
            return true;
        if (num % 2 == 0)
            num /= 2;
        else if (num % 3 == 0)
            num /= 3;
        else if (num % 5 == 0)
            num /= 5;
        else
            return false;
    }
    return true;
}

在这里插入图片描述

发布了184 篇原创文章 · 获赞 253 · 访问量 34万+

猜你喜欢

转载自blog.csdn.net/williamgavin/article/details/104554086
今日推荐