剑指Offer——丑数
剑指Offer——丑数
前言
参照《剑指Offer》,通过洞悉其思想并消化吸收,改为java实现,供自己以后巩固。
package cn.edu.ujn.offersword;
import java.util.Scanner;
public class C5_34_UglyNumber {
/**
 * @date 2016-09-16
 * @number 01
 * @author SHQ
 * 丑数
 * 题目描述
 *把只包含因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含因子7。习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。
 * 思路
 *空间换时间
 *根据丑数的定义,丑数应该是另一个丑数乘以2,3,或5所得(1除外)。故非丑数不在计算范围之内。额外创建一个数组,用于存放已确定的丑数。
 *通过设置3个变量,用于标记第一个大于最大丑数的位置,并将3个变量中的最小丑数作为下一个丑数。 同时避免重复计算。
 * 空间复杂度O(n);
 */
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
while(in.hasNextInt()){
int index = in.nextInt();
System.out.println(GetUglyNumber_Solution2(index));
}
}
// 超时
    private static int GetUglyNumber_Solution(int index) {
    	if(index <= 0){
    	return 0;
    	}
    	int cnt = 0;
    	int number = 1;
    	while(cnt < index){
    	if(isUgly(number)){
    	cnt++;
    	}
    	number++;
    	}
    	return number;
    }
    private static boolean isUgly(int num){
    	while(num % 2 == 0)
    	num /= 2;
    	while(num % 3 == 0)
    	num /= 3;
    	while(num % 5 == 0)
    	num /= 5;
    	return num == 1 ? true : false;
    }
    private static int GetUglyNumber_Solution2(int index) {
    	if(index <= 0){
    	return 0;
    	}
    	int [] arr = new int [index];
    	arr[0] = 1;
    	int index2 = 0, index3 = 0, index5 = 0, nextIndex = 1;
    	while(nextIndex < index){
    	System.out.print(arr[nextIndex-1] + " ");
    	int min = min(arr[index2]*2, arr[index3]*3, arr[index5]*5);
    	arr[nextIndex] = min;
    	while(arr[index2] * 2 <= arr[nextIndex])
    	index2++;
    	while(arr[index3] * 3 <= arr[nextIndex])
    	index3++;
    	while(arr[index5] * 5 <= arr[nextIndex])
    	index5++;
    	nextIndex++;
    	}
    	return arr[nextIndex-1];
    }
    private static int min(int a, int b, int c){
    	int min = (a > b) ? b : a;
    	return min > c ? c : min;
    }
}
美文美图
剑指Offer——丑数的更多相关文章
- 剑指Offer丑数问题
		这是剑指第一次卡死我的题……记录一下 首先看题目: 把只包含质因子2.3和5的数称作丑数(Ugly Number).例如6.8都是丑数,但14不是,因为它包含质因子7. 习惯上我们把1当做是第一个丑数 ... 
- 剑指offer 丑数
		思路:可以发现,每个丑数都是由以前的丑数得到.当前丑数一定是之前丑数能够得到的最小丑数. AC代码 class Solution { public: int GetUglyNumber_Solutio ... 
- 用js刷剑指offer(丑数)
		题目描述 把只包含质因子2.3和5的数称作丑数(Ugly Number).例如6.8都是丑数,但14不是,因为它包含质因子7. 习惯上我们把1当做是第一个丑数.求按从小到大的顺序的第N个丑数. 思路 ... 
- 剑指offer——丑数(c++)
		题目描述只包含质因子2.3和5的数称作丑数(UglyNumber).例如6.8都是丑数,但14不是,因为它包含质因子7,习惯上我们把1当做是第一个丑数.求按从小到大的顺序的第N个丑数. 思路:1.逐个 ... 
- 剑指offer--33.丑数
		本来用数组做标志位,但是测试数据有第1500个,859963392,惹不起哦 ------------------------------------------------------------- ... 
- 剑指Offer-32.丑数(C++/Java)
		题目: 把只包含质因子2.3和5的数称作丑数(Ugly Number).例如6.8都是丑数,但14不是,因为它包含质因子7. 习惯上我们把1当做是第一个丑数.求按从小到大的顺序的第N个丑数. 分析: ... 
- 剑指Offer32 丑数
		/************************************************************************* > File Name: 32_UglyNu ... 
- 干货 | 剑指offer系列文章汇总
		下面是名企面试中经常会出现的面试题目,大家可以戳相应的题目查看题目细节,其答案会在紧接着的后一篇中出现 剑指offer系列 始 剑指offer—灯管问题(1) 剑指offer—10人电梯(2) ... 
- 【剑指offer】丑数
		把只包含因子2.3和5的数称作丑数(Ugly Number).例如6.8都是丑数,但14不是,因为它包含因子7. 习惯上我们把1当做是第一个丑数.求按从小到大的顺序的第N个丑数. leetcode上也 ... 
随机推荐
- 【NOIP2015TG】solution
			链接:https://www.luogu.org/problem/lists?name=&orderitem=pid&tag=83%2C32 D1T1(magic) 题意:看题目.. ... 
- hdu 1828 线段树扫描线(周长)
			Picture Time Limit: 6000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Sub ... 
- poj 2065 高斯消元(取模的方程组)
			SETI Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 1735 Accepted: 1085 Description ... 
- bzoj1096[ZJOI2007]仓库建设 斜率优化dp
			1096: [ZJOI2007]仓库建设 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 5482 Solved: 2448[Submit][Stat ... 
- 4455[Zjoi2016]小星星 容斥+dp
			4455: [Zjoi2016]小星星 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 527 Solved: 317[Submit][Status] ... 
- 《Java技术》的第二次作业
			(一)学习总结 1.什么是构造方法?什么是构造方法的重载?下面的程序是否可以通过编译?为什么? (1) 构造方法用于在创建对象时对其进行初始化,且方法名与类名相同,方法名前面没有返回值类型的声明,不能 ... 
- swift 初始化
			知识点总结: 1.结构体 1.1.默认初始化方法:1.空初始化方法:2.成员初始化方法 struct Person{ var name = "tom" var age = } le ... 
- Vim8.0在Debian下,normal模式的O命令出现延时
			Update 2018/4/26 问题是什么 在Debian的Vim8.0中,normal模式下,使用O创建新行,常常出现延迟情况:按下O后,可以看见O首先在当前光标位置出现,过了大约0.5-1秒,接 ... 
- Python小代码_5_二维矩阵转置
			使用列表推导式实现二维矩阵转置 matrix = [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]] print(matrix) matrix_t = [[ro ... 
- Java 并发编程——Executor框架和线程池原理
			Eexecutor作为灵活且强大的异步执行框架,其支持多种不同类型的任务执行策略,提供了一种标准的方法将任务的提交过程和执行过程解耦开发,基于生产者-消费者模式,其提交任务的线程相当于生产者,执行任务 ... 
