• 丑数


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

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

    package com.wyl;
    /**
     * 求丑数
     * 问题描述:我们只把包含因子2、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*2、uglyNumber3*3和uglyNumber5*5中最小的数,
                //并且更新uglyNumber2、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); } }
  • 相关阅读:
    jsp输出当前时间
    java连接操作Oracle
    Oracle 内置函数
    伪表和伪列
    关于listview视图的 作业
    5月21日 课堂总结
    网格布局作业
    网格布局视图整理
    5月19日课堂总结
    拷贝程序
  • 原文地址:https://www.cnblogs.com/studyDetail/p/7238828.html
Copyright © 2020-2023  润新知