将数组排成最小的数:题目描述
输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。
例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。
思路
利用sort排序,自己手写copare函数
class Solution {
public:
static bool compare(string str1,string str2){
return (str1 + str2) < (str2 + str1);
}
string PrintMinNumber(vector<int> numbers) {
vector<string> str;
for(int i = 0; i < numbers.size(); i++)
str.push_back(to_string(numbers[i]));
//然后排序
sort(str.begin(),str.end(),compare);
string res;
for(int i = 0; i < str.size(); i++)
res += str[i];
return res;
}
};
丑数:题目描述
把只包含质因子2、3和5的数称作丑数(Ugly Number)。
例如6、8都是丑数,但14不是,因为它包含质因子7。
习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数
思路
- 初始化一个index大小的数组,并且第一个元素为1,且定义三个指针p2,p3,p5均指向0号元素
- 取p2 *2 和p3 * 3和p5 * 5的最小值,如果p2 * 2 或者p3 * 3 或者p5 * 5等于最小值的时候将,相应的指针++
class Solution {
public:
int GetUglyNumber_Solution(int index) {
if(index <= 0) return 0;
vector<int> number(index);
number[0] = 1;
int p2 = 0,p3 = 0,p5 = 0;
for(int i = 1; i < index; i++){
int m = min(min(number[p2] * 2,number[p3] * 3),number[p5] * 5);
number[i] = m;
if(number[p2] * 2 == m) p2++;
if(number[p3] * 3 == m) p3++;
if(number[p5] * 5 == m) p5++;
}
return number[index - 1];
}
};
第一个只出现一次的字符
在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写).
思路
利用空间换时间
class Solution {
public:
int FirstNotRepeatingChar(string str) {
if(str.size() == 0) return -1;
vector<int> cnt(58,0);
for(auto s:str)
cnt[s - 'A']++;
int res = -1;;
for(int i = 0; i < str.size(); i++)
if(cnt[str[i] - 'A'] == 1){
res = i;
break;
}
return res;
}
};