剑指offer之寻找丑数,待字闺中之序列生成分析

题目来源:剑指offer之寻找丑数 与 待字闺中之序列生成分析

两个题目其实是同一个问题,所有放在一起,算是总结一下,题目如下:

给定一个表达式2^i*2^j,其中i,j为非负整数。请找到一种方法,生成如下序列:

2^0 * 5^0 = 1
2^1 * 5^0 = 2
2^2 * 5^0 = 4
2^0 * 5^1 = 5
2^3 * 5^0 = 8
2^1 * 5^1 = 10
2^4 * 5^0 = 16
2^2 * 5^1 = 20
2^0 * 5^2 = 25
...
...
...

阅读题目,要得到生成的数字序列是有序的,尽管题目中,并没有明说。这个题目的方法,是比较多的。我们在这里介绍几个。

一个简单的方法

很多同学,应该接触过丑数那个题目吧?这个题目相比之下,还要简单一些。i,j分别是2和5的指数, 则方法的过程如下:

i,j 从0开始,记录较小的值作为序列的当前生成值。则i=j=0时,最小值为1,就是第一个元素;

两个值都是最小元素,所以i和j,都自增1,在最小值1的基础之上乘以2和5得到2,5, 取较小的2作为序列的值,即2,第二个;

此时,只对i进行变化,自增1,在其上一个值的基础之上乘以2,即,2*2=4,再与5比较最小值。具体代码如下:

vector<int> UglyNumber(int n)
{
	vector<int> ugly(n);
	ugly[0] = 1;
	int i2 = 0,i5 = 0,index;//i2和i5表示当前即将乘以2和5的下标
	for(index = 1;index < n;index++)
	{
		int curUgly = min(ugly[i2]*2,ugly[i5]*5);
		ugly[index] = curUgly;
		while(ugly[i2] * 2 <= curUgly)i2++;  //修改i2
		while(ugly[i5] * 5 <= curUgly)i5++; //修改i5
	}
	return ugly;
}

int main()
{
	int n;
	while(cin >> n)
	{
		vector<int> ugly = UglyNumber(n);
		for(int i = 0;i < n;i++)cout << ugly[i] << " ";
		cout << endl;
	}
}

剑指offer之寻找丑数,待字闺中之序列生成分析

时间: 2024-10-11 11:17:21

剑指offer之寻找丑数,待字闺中之序列生成分析的相关文章

剑指offer之【丑数】☆

题目: 丑数 链接: https://www.nowcoder.com/practice/6aa9e04fc3794f68acf8778237ba065b?tpId=13&tqId=11186&tPage=2&rp=1&ru=%2Fta%2Fcoding-interviews&qru=%2Fta%2Fcoding-interviews%2Fquestion-ranking 题目描述: 把只包含因子2.3和5的数称作丑数(Ugly Number).例如6.8都是丑数,

剑指Offer对答如流系列 - 丑数

面试题49:丑数 题目描述 我们把只包含质因子2.3和5的数称作丑数(Ugly Number).求按从小到大的顺序的第N个丑数. 例如6.8都是丑数,但14不是,因为它包含质因子7. 习惯上我们把1当做是第一个丑数. 问题分析 判断一个数是不是丑数,最容易想到的方法就是让这个数不断除以2,3,5. 对于第N个丑数,只要从1开始,依次判断每个数是不是丑数,如果是,则相应的序号加1,直到序号为N,就是我们要的丑数了.但是这种方法时间效率很,通常面试官不会满意这样的答案.因此我们需要一个时间复杂度更低

【剑指Offer】33:丑数

题目描述 把只包含质因子2.3和5的数称作丑数(Ugly Number).例如6.8都是丑数,但14不是,因为它包含质因子7. 习惯上我们把1当做是第一个丑数.求按从小到大的顺序的第N个丑数. 题解: 1 //所有的丑数分为三种类型 2*i,3*i,5*i ,其中 i是数组中的元素,一开始只有1 2 public static int GetUglyNumber_Solution(int index) { 3 // 0-6的丑数分别为0-6 4 if(index<7) { 5 return in

剑指offer 66题 -- 丑数

class Solution {public: int GetUglyNumber_Solution(int index) { //变量定义区 int subA=0, subB=0, subC=0; int sub =0; int* array = new int[index]; array[0] = 1; if(index <= 0) return 0; //分析:数组的后面的每一个元素必定是由数组前面的某一个乘以2,3,或者5得到 //  也就是说, 每个当前的值,都是由前面的某个值的2倍,

剑指offer(四十一)之翻转单词顺序列

题目描述 牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上.同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思.例如,"student. a am I".后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是"I am a student.".Cat对一一的翻转这些单词顺序可不在行,你能帮助他么? 代码: <span style="font-family:SimSun;fon

剑指Offer——和为S的连续正数序列

题目描述: 小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100.但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数).没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22.现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列? Good Luck! 输入描述: 输出所有和为S的连续正数序列.序列内按照从小至大的顺序,序列间按照开始数字从小到大的顺序 分析: 假设 i,j 分别是第一个数和最

剑指Offer:栈的压入/弹出序列

栈的压入/弹出序列 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列.(注意:这两个序列的长度是相等的) class Solution { public: bool IsPopOrder(vector<int> pushV,vector<int> popV) { //

剑指offer (34) 丑数

题目:只包含因子2,3,5的数成为 丑数 求从小到大第1500个丑数 通常我们把1当作第一个丑数 方法一:逐个判断每个整数是不是丑数 如何判断一个数是不是丑数? 根据定义,丑数只能被2,3,5整除,也就是说,这个数的因子中只能是2,3,5 我们不断用这个数除以2,3,5,直到最后,如果得到1,那么这个数就是丑数 bool IsUgly(int num) { assert(num >= 0); while (num % 2 == 0) { num /= 2; } while (num % 3 ==

剑指OFFER之丑数(九度OJ1214)

题目描述: 把只包含因子2.3和5的数称作丑数(Ugly Number).例如6.8都是丑数,但14不是,因为它包含因子7.习惯上我们把1当做是第一个丑数.求按从小到大的顺序的第N个丑数. 输入: 输入包括一个整数N(1<=N<=1500). 输出: 可能有多组测试数据,对于每组数据,输出第N个丑数. 样例输入: 3 样例输出: 3 解题思路: 最简单的思路是,从1到大数,每个数都检测一遍是否是丑数,检测方法可以考虑 int ugly(int number){ if(number%2 == 0