丑数

问题描述:咱们只把包含因子二、3和5的数称为丑数。求按从小到大的顺序的第1500个丑数。数组

分析:要找到第i个丑数,须要用辅助数组存储前面i-1个丑数,用空间换取时间。spa

package com.wyl; /** * 求丑数 * 问题描述:咱们只把包含因子二、3和5的数称为丑数。求按从小到大的顺序的第1500个丑数。 * @author wyl * */
public class UglyNumber { /** * 获得第number个丑数 * @param number * @return
     */
    public int getUglyNumber(int number){ int[] uglyNumbers = new int[number]; //用来存储丑数
        uglyNumbers[0] = 1; //第一个丑数为1
        int nextUglyIndex = 1; //控制给uglyNumbers数组存储丑数的下标
        
        int uglyNumber2 = 0; //记录乘以2的指针
        int uglyNumber3 = 0; //记录乘以3的指针
        int uglyNumber5 = 0; //记录乘以5的指针
        
        while(nextUglyIndex < number){ //要存储的丑数必须是uglyNumber2*二、uglyNumber3*3和uglyNumber5*5中最小的数, //而且更新uglyNumber二、uglyNumber3和uglyNumber5的指针, //保证存在某个丑数使得要存储的丑数左边的丑数*2都比它 小,右边的*2都比它大 //保证存在某个丑数要存储的丑数左边的丑数*3都比它 小,右边的*3都比它大 //保证存在某个丑数要存储的丑数左边的丑数*5都比它 小,右边的*5都比它大
            int min = Min(uglyNumbers[uglyNumber2] * 2, uglyNumbers[uglyNumber3] * 3, uglyNumbers[uglyNumber5] * 5); uglyNumbers[nextUglyIndex] = min; while(uglyNumbers[uglyNumber2] * 2 <= uglyNumbers[nextUglyIndex]){ ++uglyNumber2; //移动乘2的指针
 } while(uglyNumbers[uglyNumber3] * 3 <= uglyNumbers[nextUglyIndex]){ ++uglyNumber3; //移动乘3的指针
 } while(uglyNumbers[uglyNumber5] * 5 <= uglyNumbers[nextUglyIndex]){ ++uglyNumber5; //移动乘5的指针
 } ++nextUglyIndex; } return uglyNumbers[number-1]; } 
  //求三个整数中的最小值
private int Min(int i, int j, int k) { // TODO Auto-generated method stub int min = i<j?i:j; min = (min < k)?min:k; return min; } public static void main(String[] args) { UglyNumber uglyNumber = new UglyNumber(); int uNumber = uglyNumber.getUglyNumber(10); System.out.println("第1500个丑数为:" + uNumber); } }
相关文章
相关标签/搜索