剑指offer系列源码-丑数

题目1214:丑数
时间限制:1 秒内存限制:32 兆特殊判题:否提交:1700解决:756
题目描述:
把只包含因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含因子7。
习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。
输入:
输入包括一个整数N(1<=N<=1500)。
输出:
可能有多组测试数据,对于每组数据,
输出第N个丑数。
样例输入:
3
样例输出:
3
#include <iostream>
#include<stdio.h>
using namespace std;
int Min(int a,int b,int c){
  int min = (a<b)?a:b;
  return min<c?min:c;
}
int getUglyNumber(int index){
    if(index<=0){
        return 0;
    }
    int * pUglyNumbers = new int[index];
    pUglyNumbers[0] = 1;
    int nextUglyIndex = 1;
    int* pMultiply2 = pUglyNumbers;
    int* pMultiply3 = pUglyNumbers;
    int* pMultiply5 = pUglyNumbers;
    while(nextUglyIndex<index){
        int min = Min(*pMultiply2*2,*pMultiply3*3,*pMultiply5*5);
        pUglyNumbers[nextUglyIndex] = min;
        while(*pMultiply2*2<=pUglyNumbers[nextUglyIndex]){
            ++pMultiply2;
        }
        while(*pMultiply3*3<=pUglyNumbers[nextUglyIndex]){
            ++pMultiply3;
        }
        while(*pMultiply5*5<=pUglyNumbers[nextUglyIndex]){
            ++pMultiply5;
        }
        nextUglyIndex++;
    }
    return pUglyNumbers[nextUglyIndex-1];
}
int main(){
    int n;
    while(scanf("%d",&n)!=EOF){
        printf("%d\n",getUglyNumber(n));
    }
    return 0;
}

时间: 2024-08-03 22:31:50

剑指offer系列源码-丑数的相关文章

剑指offer系列59---寻找丑数

[题目]把只包含因子2.3和5的数称作丑数(Ugly Number). * 例如6.8都是丑数,但14不是,因为它包含因子7. 习惯上我们把1当做是第一个丑数.求按从小到大的顺序的第N个丑数. 解法一:此解提交运行超时,不推荐. 1 package com.exe11.offer; 2 3 /** 4 * [题目]把只包含因子2.3和5的数称作丑数(Ugly Number). 5 * 例如6.8都是丑数,但14不是,因为它包含因子7. 习惯上我们把1当做是第一个丑数.求按从小到大的顺序的第N个丑

剑指offer系列源码-圆圈中最后剩下的数

题目1356:孩子们的游戏(圆圈中最后剩下的数) 时间限制:10 秒内存限制:32 兆特殊判题:否提交:1073解决:391 题目描述: 每年六一儿童节,JOBDU都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此.HF作为JOBDU的资深元老,自然也准备了一些小游戏.其中,有个游戏是这样的:首先,让小朋友们围成一个大圈.然后,他随机指定一个数m,让编号为1的小朋友开始报数.每次喊到m的那个小朋友要出列唱首歌,然后可以在礼品箱中任意的挑选礼物,并且不再回到圈中,从他的下一个小朋友开始,继续1.

剑指offer系列源码-把数组排成最小的数

题目1504:把数组排成最小的数 时间限制:1 秒内存限制:128 兆特殊判题:否提交:1463解决:448 题目描述: 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个.例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323. 输入: 输入可能包含多个测试样例. 对于每个测试案例,输入的第一行为一个整数m (1<=m <=100)代表输入的正整数的个数. 输入的第二行包括m个正整数,其中每个正整数不超过10000000.

剑指offer系列源码-翻转单词顺序

题目1361:翻转单词顺序 时间限制:2 秒内存限制:32 兆特殊判题:否提交:1935解决:572 题目描述: JOBDU最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上.同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思.例如,"student. a am I".后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是"I am a student.".Cat对一一的翻转这些单词顺序可不在行,

剑指offer系列源码-和为S的两个数字

题目1352:和为S的两个数字 时间限制:2 秒内存限制:32 兆特殊判题:否提交:2651解决:668 题目描述: 输入一个递增排序的数组和一个数字S,在数组中查找两个数,是的他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的. 输入: 每个测试案例包括两行: 第一行包含一个整数n和k,n表示数组中的元素个数,k表示两数之和.其中1 <= n <= 10^6,k为int 第二行包含n个整数,每个数组均为int类型. 输出: 对应每个测试案例,输出两个数,小的先输出.如果找不到

剑指offer系列源码-包含min函数的栈

题目1522:包含min函数的栈 时间限制:1 秒内存限制:128 兆特殊判题:否提交:1495解决:476 题目描述: 定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数. 输入: 输入可能包含多个测试样例,输入以EOF结束. 对于每个测试案例,输入的第一行为一个整数n(1<=n<=1000000), n代表将要输入的操作的步骤数. 接下来有n行,每行开始有一个字母Ci. Ci='s'时,接下有一个数字k,代表将k压入栈. Ci='o'时,弹出栈顶元素. 输出: 对应每个测

剑指offer系列源码-数组中出现次数超过一半的数字

题目1370:数组中出现次数超过一半的数字 时间限制:1 秒内存限制:32 兆特殊判题:否提交:2844解决:846 题目描述: 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2. 输入: 每个测试案例包括2行: 第一行输入一个整数n(1<=n<=100000),表示数组中元素的个数. 第二行输入n个整数,表示数组中的每个元素,这n个整数的范围是[1,10

剑指offer系列源码-二叉搜索树的后序遍历序列

题目1367:二叉搜索树的后序遍历序列 时间限制:1 秒内存限制:32 兆特殊判题:否提交:1359解决:684 题目描述: 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同. 输入: 每个测试案例包括2行: 第一行为1个整数n(1<=n<=10000),表示数组的长度. 第二行包含n个整数,表示这个数组,数组中的数的范围是[0,100000000]. 输出: 对应每个测试案例,如果输入数组是某二叉搜索树的

剑指offer系列源码--二维数组中的查找

题目1384:二维数组中的查找 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:14827 解决:2888 题目描述: 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 输入: 输入可能包含多个测试样例,对于每个测试案例, 输入的第一行为两个整数m和n(1<=m,n<=1000):代表将要输入的矩阵的行数和列数. 输入的第二行包括一个整数t(1<=t<=1