面试题四十九:丑数

只包含因子2,3,5,的数称为丑数;求小到大的顺序的第1500个丑数,1是第一个丑数 方法一:不牺牲空间进行,遍历增加

bool 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;
            }
            
          int GetUglyNumber(int index){
                if(index<=0) return 0;
                
                int number=0;
                while(index>0){
                    ++number;
                    if(isUgly(number))
                        index--;         
                }        
          }

方法二:牺牲空间换时间,利用第一个丑数1得到其他丑数,根据丑数大小排序

private static int getUglyNumberAt(int index)
    {
        if (index < 1) return 0;
        if (index < 7) return index;   //前6个数都是
        int[] records = new int[index];  //从小到大记录丑数
        records[0] = 1;
        //2, 3, 5对应的丑数位置,初始化为第一个位置,准备
        int indexFor2 = 0;
        int indexFor3 = 0;
        int indexFor5 = 0;
        for (int i = 1; i < index; i++)
        {
            //已知的丑数乘以因子2, 3, 5,
            //使得这三个新丑数刚刚大于已在数组中的所有丑数
            int product2 = records[indexFor2] * 2;
            int product3 = records[indexFor3] * 3;
            int product5 = records[indexFor5] * 5;
            //找出三个新丑数中最小的
            int min = getMin(product2, product3, product5);
            records[i] = min;
            //更新2, 3, 5相应的丑数位置,min可能等于多个新丑数,所以不能用else
            if (product2 == min) indexFor2++;
            if (product3 == min) indexFor3++;
            if (product5 == min) indexFor5++;
        }
        return records[index - 1];
    }


    private static int getMin(int a, int b, int c)
    {
        int result = a;
        if (b < result) result = b;
        if (c < result) result = c;
        return result;
    }

 

posted @ 2020-03-29 16:44  浪波激泥  阅读(243)  评论(0编辑  收藏  举报