这道题算是感觉非常难的一道题
先跳过,后面有时间了再讨论
接着看下面这一道题
当然在第一步变完之后还需要考虑的就是假如人家本身就是回文的话,那就需要找一次最大的,找一次最小的
对于解决进位的问题是每次多给前面准备一个空位,用字符0填充
对于解决每次加减某一位这里采用的是,( 字符串长度 - 1)/ 2 的方式来确定对字符串的哪一位进行修改
这个题之前我都已经做了,现在这次是左神讲的,再来分析一下
暴力解法就是这个,就是直接对一个数,去除以2/3/5,直到把这三个因子除完,如果除完之后结果是1,那么就说明,这个数只含有2/3/5,这三个因子,反之不是,但是效率太低
分析每一个丑数其实都是由上一个丑数*2/3/5得到的,那么只要从第一个丑数开始推就可以快速计算到每一个丑数
代码:
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
void func(int num)
{
vector<int> vec;
vec.resize(num);
int i1 = 0, i2 = 0, i3 = 0;
vec[0] = 1;
int count = 1;
while (count < num)
{
vec[count] = min(min(vec[i1] * 2, vec[i2] * 3), vec[i3] * 5);
if (vec[count] == vec[i1] * 2)
++i1;
if (vec[count] == vec[i2] * 3)
++i2;
if (vec[count] == vec[i3] * 5)
++i3;
++count;
}
cout << vec[count - 1] << endl;;
}
int main()
{
func(10);
return 0;
}
需要注意的是,丑数其实只是出题人定义的一种规则,这种规则可以被改变成任意的规则,也就是说在解决很多自定义的规则的时候,要求后面的数,可以多想想它是由前面的那个数字所得到的,这个思路可以解决很多的问题