1.把数组排成最小的数
时间限制:1秒 空间限制:32768K 热度指数:150958
本题知识点: 数组
题目描述
输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。
解题思路:
- 我们应该找到一种排序规则,数组根据这个排序规则可以排成一个最小的数字
- 要确定一个规则,就要比较两个数字,哪个应该排在前面,不是比较两个数值大小哦
- 如果mn<nm,那么我们应该选择mn,定义此时的m<n
- 如果mn>nm,那么我们应该选择nm,定义为此时的n<m
- 如果mn=nm,选择哪个都可以,定义为此时的m=n
- 然后就是拼接数字,直接计算mn和nm的大小便可,但是两个Int拼接起来的数字有可能超出Int所能表示的范围
- 一个直观的解决大数的问题办法就是将数字转换成字符串,那么就变成了比较字符串的大小了
class Solution {
public:
static bool cmp(string a, string b)
{
return a+b<b+a;
}
string PrintMinNumber(vector<int> numbers) {
string result;
if(numbers.size() == 0)
return result;
vector<string> tmp;
for(int i = 0; i<numbers.size(); i++)
{
stringstream ss;
ss<<numbers[i];
tmp.push_back(ss.str());
}
sort(tmp.begin(),tmp.end(),cmp);
for(int i =0; i<tmp.size(); i++)
{
result+=tmp[i];
}
return result;
}
};
2.丑数
时间限制:1秒 空间限制:32768K 热度指数:169190
本题知识点: 数组
题目描述
把只包含质因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含质因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。
解题思路:
- 思路一,时间复杂度较高
- 根据丑数的定义,丑数只能被2、3、5整除,也就是说,如果一个数能被2整除,就连续除以2;如果能被3整除就连续除以3;如果能被5整除就连续除以5
- 如果最后除到的结果等于1,那么这个数就是丑数
- 但是算法时间复杂度过高
class Solution {
public:
int GetUglyNumber_Solution(int index) {
if(index < 0)
return 0;
int number = 0;
int uglyFound = 0;
while(uglyFound < index)
{
++number;
if(IsUgly(number))
++uglyFound;
}
return number;
}
bool IsUgly(int number)
{
while(number % 2 == 0)
number /= 2;
while(number % 3 ==0)
number /= 3;
while(number % 5 == 0)
number /= 5;
return (number == 1) ? true : false;
}
};
- 思路二,以空间换时间
- 我们可以找到一种只计算丑数的方法,就不用在非丑数上进行计算浪费时间
- <