UglyNumber - 找“丑数”
uglynumber的定义是只能被1,2,3,5整除的数
规定1是第一个uglynumber;以此类推,1 2 3 4 5 6 8 9 10 12 15 16 18 20 24 25 27 30 32 36 40 ...
问题1,给定一个非零int整数,判断是否为ugly number
此数除以2,3,5;看是否能被整除;整除的判断是用hasDigit方法,利用小数来判断的
如果能被整除,递归下去,再除以2,3,5;直到完成判断
/**
* Ugly number1
* @author Rust Fisher
* Judge the number whether ugly
*/
public class UglyNumber1 {
public static boolean hasDigit(double d){
return d*10%10 != 0;
}
/**
* @param num
* @return boolean whether num is ugly
*/
public static boolean isUgly(int num) {
if (num <= 0) {
return false;
}
if (num == 1) {
return true;
}
if (!hasDigit(num/2.0)) {
if (isUgly(num/2)) {
return true;
}
}
if (!hasDigit(num/3.0)) {
if (isUgly(num/3)) {
return true;
}
}
if (!hasDigit(num/5.0)) {
if (isUgly(num/5)) {
return true;
}
}
return false;
}
/**
* Find the nth ugly number
* @param n
* @return the nth ugly number
*/
public static int nthUglyNumber(int n) {
if (n <= 0) {
return -1;
}
int count = 0;
int i = 0;
while (count <= n){
if (isUgly(i)) {
count++;
}
if (count == n) {
break;
}
i++;
}
return i;
}
public static void main(String args[]){
int count = 0;
for (int i = 0; i < 100; i++) {
if (isUgly(i)) {
count++;
System.out.print(i + "\t");
}
if (count == 10) {
count = 0;
System.out.println();
}
}
System.out.println("\nThe n-th ugly numbers : ");
count = 0;
for (int i = 1; i < 21; i++) {
System.out.print(nthUglyNumber(i) + " ");
}
System.out.println("\n用这种方式输出第n个ugly number很没效率");
}
}
输出:
1 2 3 4 5 6 8 9 10 12 15 16 18 20 24 25 27 30 32 36 40 45 48 50 54 60 64 72 75 80 81 90 96 The n-th ugly numbers : 1 2 3 4 5 6 8 9 10 12 15 16 18 20 24 25 27 30 32 36 用这种方式输出第n个ugly number很没效率
问题2:求第n个ugly number
比如第1个ugly number是1,第二个是2,第三个是3 ...
已知1,2,3,5是ugly number,那么接下去的数能够乘以2,3,5得到;一个一个向后推算,直到第n个
设定3个游标,对应因数为2,3,5;利用到因数2一次,index2加一
public class UglyNumber2{
public static int getMin(int a,int b,int c){
int min = a < b ? a : b;
return min < c ? min : c;
}
public static int nthUglyNumber(int n) {
if (n < 1) {
return -1;
}
int index2 = 0, index3 = 0, index5 = 0; // three index
int[] uglyNums = new int[n];
uglyNums[0] = 1;
int next = 1;
while (next < n) {
uglyNums[next] = getMin(uglyNums[index2]*2,uglyNums[index3]*3,uglyNums[index5]*5);
if (uglyNums[next] == uglyNums[index2]*2) index2++;// find out which index should move
if (uglyNums[next] == uglyNums[index3]*3) index3++;// index moving forward
if (uglyNums[next] == uglyNums[index5]*5) index5++;
next++;
}
return uglyNums[next - 1];
}
public static void main(String args[]){
for (int i = 1; i < 21; i++) {
System.out.print(nthUglyNumber(i) + " ");
}
}
}
输出:
1 2 3 4 5 6 8 9 10 12 15 16 18 20 24 25 27 30 32 36
输出了前20个ugly number
UglyNumber - 找“丑数”的更多相关文章
- 剑指offer系列59---寻找丑数
[题目]把只包含因子2.3和5的数称作丑数(Ugly Number). * 例如6.8都是丑数,但14不是,因为它包含因子7. 习惯上我们把1当做是第一个丑数.求按从小到大的顺序的第N个丑数. 解法一 ...
- 4 丑数 Ⅱ-找出第n个丑数
原题网址:http://www.lintcode.com/zh-cn/problem/ugly-number-ii/ 设计一个算法,找出只含素因子2,3,5 的第 n 小的数. 符合条件的数如:1, ...
- 剑指offer-第5章优化时间和空间效率(丑数)
题目:我们把只包含因子2,3,5的数叫做丑数.寻找第1500个丑数.通常把1当成第一个丑数. 思路1:第一步判断是否为丑数:丑数是只包含2,3,5的数,因此一定可以被2,3,5整除.通过求余数是否为零 ...
- 37.寻找丑数[Ugly numbers]
[题目] 我们把只包含质因子2.3和5的数称作丑数(Ugly Number),例如:2,3,4,5,6,8,9,10,12,15,等,习惯上我们把1当做是第一个丑数.求按从小到大的顺序的第1500个丑 ...
- 洛谷P2723 丑数 Humble Numbers
P2723 丑数 Humble Numbers 52通过 138提交 题目提供者该用户不存在 标签USACO 难度普及/提高- 提交 讨论 题解 最新讨论 暂时没有讨论 题目背景 对于一给定的素数 ...
- lintcode :Ugly Numbers 丑数
题目 丑数 设计一个算法,找出只含素因子3,5,7 的第 k 大的数. 符合条件的数如:3,5,7,9,15...... 样例 如果k=4, 返回 9 挑战 要求时间复杂度为O(nlogn)或者O(n ...
- 剑指OFFER之丑数(九度OJ1214)
题目描述: 把只包含因子2.3和5的数称作丑数(Ugly Number).例如6.8都是丑数,但14不是,因为它包含因子7.习惯上我们把1当做是第一个丑数.求按从小到大的顺序的第N个丑数. 输入: 输 ...
- 丑数 LeeTCode
题目链接:http://www.lintcode.com/zh-cn/problem/ugly-number-ii/ 题目描述:设计一个算法,找出只含素因子2,3,5 的第 n 大的数.符合条件的数如 ...
- Humble Numbers(丑数) 超详解!
给定一个素数集合 S = { p[1],p[2],...,p[k] },大于 1 且素因子都属于 S 的数我们成为丑数(Humble Numbers or Ugly Numbers),记第 n 大的丑 ...
随机推荐
- 【小练习04】HTML+CSS--医药健康小页面
要求实现如下效果图: 代码演示 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"&g ...
- 基于NopCommerce的开发框架——缓存、网站设置、系统日志、用户操作日志
最近忙于学车,抽时间将Nop的一些公用模块添加进来,反应的一些小问题也做了修复.另外有园友指出Nop内存消耗大,作为一个开源电商项目,性能方面不是该团队首要考虑的,开发容易,稳定,代码结构清晰简洁也是 ...
- 初识Java(2) 变量与数据类型
一. 变量 1.变量是内存中的一个标识符号,用于存储数据 2.变量命名规则 1) 必须以字母.下划线 _ .美元符号 $ 开头 2) 变量中,可以包括数字 3) 变量中,不能出现特殊的符号,空格 4 ...
- 线程-join();
一.join()方法,官方描述 waits for this thread to die 等待当前线程死亡: 源码: //无参,默认调用join(0) public final void join ...
- CoreAnimation学习,学习总结,记录各种过程中遇到的坑
1. CAAimation 的 duration = 0 的时候, 这个时候就相当于没有动画了. 2. CAKeyframeAnimation *rotateAnimation = [CAKeyfr ...
- vue-router如何根据不同的用户给不同的权限
闲聊: 小颖去年在上家公司用的vue1.0之前在做路由这块用的router.map,但是现在vue2.0里已经不能用了,所以之前解决权限问题的例子,小颖也参考不了呜呜 之前看一个美女写的:elemem ...
- Hybrid App开发之jQuery操作DOM
前言: 前面学习了JQuery的选择器,今天开始学习新的知识,JQuery操作DOM元素. 元素属性的访问与设置 attr(name) 获取元素属性 attr(name,value) 单个属性设置 a ...
- centos 6.6 ios镜像文件 下载 官网和阿里云两种方式教你下载
1百度一下:centos 打开打开官网.选择这一项 CET CENTOS 2选择 DVD ISO,双击下载 直接选择左键点击下载 这里需要迅雷 方法 二 打开 https://mirrors.aliy ...
- # ? & 号在url中的的作用
1. # 10年9月,twitter改版.一个显著变化,就是URL加入了"#!"符号.比如,改版前的用户主页网址为http://twitter.com/username改版后,就变 ...
- 为什么使用bootstrap在一个页面同时做两个轮播效果时,只有第一个有效??
我们都知道使用bootstrap做轮播效果非常快,但是有时候一个页面会需要两个轮播:但这个时候再次使用bootstrap做轮播效果时就会失效:原因在于bootstrap的Carousel问题,只要修改 ...