剑指offer——丑数

题目描述

把只包含质因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含质因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。

思路一:

此方法在牛客网超时,当然也有可能是我代码的问题。

如何判断一个数是否只包含因子2呢,将这个数对2取余,如果为0,就将它的值赋值为原来的值除以2,直到对2取余不为0,如果这时这个数为1,那么就只包含因子2,否则不是只包含因子2.判断是否只包含因子3、5同理。

下面的代码时间复杂度很高,因为加入第index个数为m,则对于每个小于m的数都要进行判断是否是丑数,在牛客网中这样做超时。

public class Solution {
    public int GetUglyNumber_Solution(int index) {
        if(index<0) return 0;
        int number = 0;
        int uglyFound = 0;
        while(uglyFound < index){
            ++number;
            if(isUgly(number)){
                ++uglyFound;
            }
        }
        return number;
    }
    boolean isUgly(int number){
        while(number %2 == 0){
            number /= 2;
        }
        while(number %3 ==0){
            number /= 3;
        }
        while(number %5 == 0){
            number /= 5;
        }
        return (number==1)?true:false;
    }
}

思路二:

既然每个数都判断是否是丑数时间复杂度很高,就尝试只找丑数,定义一个数组来存储丑数,后面的数由前面的数乘以2、3、5来得出,对于2、3、5,每个数都维护一个变量,来标记要乘以的元素的下标。初始化数组时,将其第一个元素定义为1,2,3,5的标记下标的变量都等于0,然后判断2、3、5哪个数乘以其对应的数组中的数最小,然后将2、3、5对应的下标变量都更新到2、3、5与其对应的数组元素的值的乘积大于最小的数(这样可以省去判断是2、3、5中哪个数对应的乘积最小),之后再将最小的乘积赋值给数组的下一个元素,直到数组中每个元素都被赋值,数组的最后一个数字就是index对应的丑数。

public class Solution {
    public static int GetUglyNumber_Solution(int index) {
        if(index<=0) return 0;
        int[] arr = new int[index];
        arr[0] = 1;
        int index2 = 0;
        int index3 = 0;
        int index5 = 0;
        for(int i=1;i<index;i++){
            int min = getMin(2*arr[index2],3*arr[index3],5*arr[index5]);
            while(2*arr[index2]<=min && index2 < i){
                index2++;
            }
            while(3*arr[index3]<=min && index3 < i){
                index3++;
            }
            while(5*arr[index5]<=min && index5 < i){
                index5++;
            }
            arr[i] = min;
        }
        return arr[--index];
    }
    public static int getMin(int num1,int num2,int num3){
        int temp = Integer.min(num1,num2);
        temp = Integer.min(temp,num3);
        return temp;
    }
}

记录一下犯的错误

1.忘写分号 2.忘写返回值 3. 定义函数没写参数类型 4.变量名写错 5.变量未定义直接使用 6. 数组越界 7. 未考虑异常输出 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值