zoukankan      html  css  js  c++  java
  • 264. Ugly Number II

    • 思路1

    出错代码:

     class Solution 
    {
    public:
        int nthUglyNumber(int n) 
    	{
    		if(n == 1)
    		{
    			return 1;
    		}
    		
            int i = 1;
    		int flag = 1;
            while(1)
    		{
    			i++;
    			if(isUgly(i))
    			{
    				flag++;
    			}
    			if(flag == n)
    			{
    				break;
    			}
    		}
    		return i;
        }
    	
    private:
        bool isUgly(int n)
    	{
    		vector<int> nums;
    		
    		if(n == 3 || n == 5 || n == 2)
    		{
    			return true;
    		}
    		
    		while(n)
    		{
    			nums.push_back(n % 10);
    			n = n / 10;
    		}
    		
    		if(nums[0] == 5 || nums[0] == 0)
    		{
    			//可以被5整除
    			return isUgly(n / 5);
    		}
    		else if(is3Divisible(nums))
    		{
    			return isUgly(n / 3);
    		}
    		else
    		{
    			//能被2整除
    			return isUgly(n / 2);
    		}
    		
    		return false;
    	}
    	
    	bool is3Divisible(vector<int>& nums)
    	{
    		int sum = 0;
    		for(int i = 0;i < nums.size();i++)
    		{
    			sum = sum + nums[i];
    		}
    		
    		if((sum % 3) == 0)
    		{
    			return true;
    		}
    		else
    		{
    			return false;
    		}
    	}
    };
    
    

    这次出错出在了

    	bool isUgly(int n)
    	{
    		vector<int> nums;
    		int number = n;
    		if (n == 3 || n == 5 || n == 2)
    		{
    			return true;
    		}
    
    		while (n)
    		{
    			nums.push_back(n % 10);
    			n = n / 10;
    		}
    
    		if (nums[0] == 5 || nums[0] == 0)
    		{
    			//可以被5整除
    			return isUgly(number / 5);
    		}
    		else if (is3Divisible(nums))
    		{
    			return isUgly(number / 3);
    		}
    		else
    		{
    			//能被2整除
    			return isUgly(number / 2);
    		}
    
    		return false;
    	}
    

    code2 代码出错 出错在

    		else
    		{
    			//能被2整除
    			return isUgly(number / 2);
    		}
    

    number = 7时可以测出这个bug。
    code3 修改后的代码,果然不出我所料,超时了。跑了几个数据都通过了,但是当n = 218时,leetcode提示Time Limit Exceeded

    class Solution
    {
    public:
    	int nthUglyNumber(int n)
    	{
    		if (n == 1)
    		{
    			return 1;
    		}
    
    		int i = 1;
    		int flag = 1;
    		while (1)
    		{
    			i++;
    			if (isUgly(i))
    			{
    				flag++;
    			}
    			if (flag == n)
    			{
    				break;
    			}
    		}
    		return i;
    	}
    
    private:
    	bool isUgly(int n)
    	{
    		vector<int> nums;
    		int number = n;
    		if (n == 3 || n == 5 || n == 2)
    		{
    			return true;
    		}
    
    		while (n)
    		{
    			nums.push_back(n % 10);
    			n = n / 10;
    		}
    
    		if (nums[0] == 5 || nums[0] == 0)
    		{
    			//可以被5整除
    			return isUgly(number / 5);
    		}
    		else if (is3Divisible(nums))
    		{
    			return isUgly(number / 3);
    		}
    		else if(is2Divisible(nums))
    		{
    			//能被2整除
    			return isUgly(number / 2);
    		}
    
    		return false;
    	}
    
    	bool is3Divisible(vector<int>& nums)
    	{
    		int sum = 0;
    		for (int i = 0; i < nums.size(); i++)
    		{
    			sum = sum + nums[i];
    		}
    
    		if ((sum % 3) == 0)
    		{
    			return true;
    		}
    		else
    		{
    			return false;
    		}
    	}
    
    	bool is2Divisible(vector<int>& nums)
    	{
    		if (nums[0] % 2 == 0)
    		{
    			return true;
    		}
    		else
    		{
    			return false;
    		}
    	}
    };
    

    再一次出错的代码

    class Solution
    {
    public:
    	int nthUglyNumber(int n)
    	{
    		vector<int> ugly;
    		ugly.push_back(1);
    
    		int Multiply2 = 0;
    		int Multiply3 = 0;
    		int Multiply5 = 0;
    		int i2 = 0;
    		int i3 = 0;
    		int i5 = 0;
    
    		while (true)
    		{
    			if (n < ugly.size())
    			{
    				return ugly[n - 1];
    			}
    			else
    			{
    				Multiply2 = ugly[i2] * 2;
    				Multiply3 = ugly[i3] * 3;
    				Multiply5 = ugly[i5] * 5;
    
    				int min = GetMin(Multiply2, Multiply3, Multiply5);
    				ugly.push_back(min);
    
    				if (min == Multiply2)
    				{
    					i2++;
    				}
    				else if (min == Multiply3)
    				{
    					i3++;
    				}
    				else
    				{
    					i5++;
    				}
    
    			}
    		}
    
    	}
    private:
    	int GetMin(int number1, int number2,int number3)
    	{
    		int min = (number1 < number2) ? number1 : number2;
    		min = (min < number3) ? min : number3;
    		return min;
    	}
    };
    

    n = 10可以测出这个bug
    最终AC版的code

    class Solution
    {
    public:
    	int nthUglyNumber(int n)
    	{
    		vector<int> ugly;
    		ugly.push_back(1);
    
    		int Multiply2 = 0;
    		int Multiply3 = 0;
    		int Multiply5 = 0;
    		int i2 = 0;
    		int i3 = 0;
    		int i5 = 0;
    
    		while (true)
    		{
    			if (n < ugly.size())
    			{
    				return ugly[n - 1];
    			}
    			else
    			{
    				Multiply2 = ugly[i2] * 2;
    				Multiply3 = ugly[i3] * 3;
    				Multiply5 = ugly[i5] * 5;
    
    				int min = GetMin(Multiply2, Multiply3, Multiply5);
    				ugly.push_back(min);
    
    				if (min == Multiply2)
    				{
    					i2++;
    				}
    				if (min == Multiply3)
    				{
    					i3++;
    				}
    				if(min == Multiply5)
    				{
    					i5++;
    				}
    
    			}
    		}
    
    	}
    private:
    	int GetMin(int number1, int number2,int number3)
    	{
    		int min = (number1 < number2) ? number1 : number2;
    		min = (min < number3) ? min : number3;
    		return min;
    	}
    };
    
    
  • 相关阅读:
    显示文件本地文件夹
    Select Dependencies选择依赖项
    搜索小技巧
    783. Minimum Distance Between BST Nodes BST节点之间的最小距离
    5. Longest Palindromic Substring 最长的回文子串
    12. Integer to Roman 整数转罗马数字
    3. Longest Substring Without Repeating Characters 最长的子串不重复字符
    539. Minimum Time Difference 最小时差
    43. Multiply Strings 字符串相乘
    445. Add Two Numbers II 两个数字相加2
  • 原文地址:https://www.cnblogs.com/Manual-Linux/p/12033432.html
Copyright © 2011-2022 走看看