zoukankan      html  css  js  c++  java
  • 剑指Offer-- 第49题 丑数

    第49题 丑数

    题目 把只包含质因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含质因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数(剑指offer上明确规定是第1500个丑数,这里没有限制丑数范围)。
    剑指offer的思路

    1. 逐个判断每个整数是不是丑数的解法,直观但不够高效,由于没有限制丑数范围的话,这种方法很容易超时,实时上我的确超时了;
    public class Solution {
        public int GetUglyNumber_Solution(int index) {
    //按照思路写的,已经超时,所以正确性没有完全得到验证;
         /*  if(index<=0) {
    			return 0;
    		}
    		int num = 1;
    		int count = 1;
    		while (count != index) {
    			num++;
    			int temp = num;
    			boolean flag = false;
    			while (temp % 2 == 0 || temp % 3 == 0 || temp % 5 == 0) {
    				if (temp % 2 == 0) {
    					temp = temp / 2;
    				} else if (temp % 3 == 0) {
    					temp = temp / 3;
    				} else if (temp % 5 == 0) {
    					temp = temp / 5;
    				}
    				if (temp == 1) {
    					flag = true;
    					break;
    				}
    			}
    			if (flag) {
    				count++;
    			}
    			
    		}
    		return num;*/
    
    //剑指offer上的代码,同样对于范围没有限制的超时了;
            	if(index<=0) {
    			return 0;
    		}
    		int num = 0;
    		int count = 0;
    		while(count<index) {
    			++num;
    			if(isUgly(num)) {
    				count++;
    			}
    		}
    		
    		return num;
        }
        //判断是否未丑数;
    	public  boolean isUgly(int number) {
    		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;
    		}
    	}
    }
    

    根据第二种思路写的代码

    //执行通过,但是时间依然很高,50ms;对于任意的N依然不是一个好的解法
    public static int GetUglyNumber_Solution(int index) {
    
    		if (index <= 0) {
    			return 0;
    		}
    		int[] arr = new int[index];
    		arr[0] = 1;
    		int num = 0; // 最大的位置;
    		
    		
    		while (num < index - 1) {
    			int M2 = 0;
    			int M3 = 0;
    			int M5 = 0;
    			int T2 = 0;
    			int T3 = 0;
    			int T5 = 0;
    			boolean flag2=false;
    			boolean flag3=false;
    			boolean flag5= false;
    			
    			// 产生下一个丑数;
    			for (int i = 0; i <= num; i++) {
    				
    				if(arr[i]*2>arr[num]&&!flag2) {
    					T2=i;
    					M2=arr[i]*2;
    					flag2 = true;
    					
    				}
    				if(arr[i]*3>arr[num]&&!flag3) {
    					T3=i;
    					M3=arr[i]*3;
    					flag3 = true;
    					
    				}
    				if(arr[i]*5>arr[num]&&!flag5) {
    					T5=i;
    					M5=arr[i]*5;
    					flag5 = true;
    					
    				}
    				if(flag2&&flag3&&flag5) {
    					int temp = ((M2<M3)?M2:M3)<M5? ((M2<M3)?M2:M3):M5;
    					arr[++num]=temp;
    					break;
    				}
    			}
    			
    		}
    		return arr[num];
    
    	}
    
    多思考,多尝试。
  • 相关阅读:
    心情记录&考试总结 3.30
    BZOJ 1982 Moving Pebbles
    BZOJ 3759 Hungergame
    51Nod 算法马拉松12 Rikka with sequences
    51Nod 算法马拉松12 移数博弈
    BZOJ 3720 gty的妹子树
    BZOJ 4184 shallot
    BZOJ 3160 万径人踪灭
    好好学习天天向上
    java解析json字符串
  • 原文地址:https://www.cnblogs.com/LynnMin/p/9340964.html
Copyright © 2011-2022 走看看