• 丑数


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

    思路1:既然是只能被2、3和5整除,那么剩余到最后的数只能是1。

    思路2:既然没个数都只能被2、3和5整除,那么这个数可以看成是:number = 2^i*3^j*5^p;

    先放置几个队列:
    L1: 3^i (i >=0)
    L2: 3^i * 5^j (j >= 1)
    L3: 3^i * 5^j * 7^k (k >= 1)
    Step1: 清空三个队列、 分别把 3,5,7 放入三个队列癿首位。 准备一个新队列 L(目前为空)。
    Step2: 比较三个队列癿头,找出最小癿那个。把返个元素从队列出队,幵加到 L 癿尾部。
    Step3:
    如果 Step2 中癿元素是从 L1 中获叏癿,假讴是 3^m,则在 L1 癿尾部加入 3^(m+1),L2 癿尾
    部加入 3^m*5,L3 癿尾部加入 3^m*7。
    如果 Step2 中癿元素是从 L2 中获叏癿,假讴是 3^m * 5^n,则在 L2 癿尾部加入 3^m * 5^(n+1),
    L3 癿尾部加入 3^m * 5^n *7。
    如果 Step3 中癿元素是从 L3 中获叏癿,假讴是 3^m * 5^n * 7^p,则在 L3 癿尾部加入 3^m *
    5^n * 7^(p+1)。
    Step4: L 癿长度到达 N 了向?如果没到达,重复 L2-L4。如果到达,则迕行 L5。
    Step5: 叏得 L 癿末尾元素,即为所求。

    public int GetUglyNumber_Solution(int index) {
            int count =0;
            int i=1;
            while(count<index){
                if(isUgly(i++)){
                    count++;
                }
            }
            return i-1;
        }
        public boolean isUgly(int number){
            if(number>=1){
                while(number%2==0){
                    number/=2;
                }
                while(number%3==0){
                    number/=3;
                }
                while(number%5==0){
                    number/=5;
                }
                if(number == 1){
                    return true;
                }else{
                    return false;
                }
            }
            return false;
        }

    思路2:

    public int GetUglyNumber_Solution(int index) {
            if(index<=0) return 0;
            Queue<Integer> stack1 = new LinkedList<>();
            Queue<Integer> stack2 = new LinkedList<>();
            Queue<Integer> stack3 = new LinkedList<>();
            List<Integer> stack = new LinkedList<>();
            stack.add(1);
            stack1.add(2);
            stack2.add(3);
            stack3.add(5);
            while(stack.size()<index){
                if(stack1.peek()<stack2.peek()&&stack1.peek()<stack3.peek()){
                    int data = stack1.poll();
                    stack.add(data);
                    stack1.add(data*2);
                    stack2.add(data*3);
                    stack3.add(data*5);
                }
                else if(stack2.peek()<stack1.peek()&&stack2.peek()<stack3.peek()){
                    int data = stack2.poll();
                    stack.add(data);
                    stack2.add(data*3);
                    stack3.add(data*5);
                }
                else if(stack3.peek()<stack1.peek()&&stack3.peek()<stack2.peek()){
                    int data = stack3.poll();
                    stack.add(data);
                    stack3.add(data*5);
                }
                
            }
            return stack.get(stack.size()-1);
        
        }
  • 相关阅读:
    HDU6060 RXD and dividing
    Knapsack in a Globalized World --多重完全背包
    hdu 6058 Kanade's sum
    矩形面积 HDU
    Bridge Across Islands POJ
    Manors HDU
    Harry Potter and J.K.Rowling HDU
    Polygons HDU
    Jungle Outpost HDU
    CRB and Farm HDU
  • 原文地址:https://www.cnblogs.com/yingpu/p/5826705.html
Copyright © 2020-2023  润新知