c++刷题技巧
1 STL sort 和 数字2字符串
题目:
输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。
贪心策略:对于任意两项数,3 32 与 32 3进行比较,由组合后的小数决定排序的先后,故 32 在 3 之前。
直接对数字比较,组合后的结果因格式定义,容易溢出。考虑数字转换为字符串;对sort传入比较的函数定义,完成stl vector的排序;最后是排序后的遍历拼接。
关键
- 数字转换字符串to_string
- 以自定义函数compare进行sort()
- 字符串拼接
class Solution {
public:
string PrintMinNumber(vector<int> numbers)
{
string res;
if (numbers.empty())
return res;
sort(numbers.begin(), numbers.end(), compare);
for (int i = 0; i < numbers.size(); i++)
{
res += to_string(numbers[i]);
}
return res;
}
static bool compare(int a, int b)
{
string A = to_string(a) + to_string(b);
string B = to_string(b) + to_string(a);
return A < B;
}
};
2 template 写法
#include <iostream>
#include <vector>
using namespace std;
template <typename elem>
elem* find(vector<elem> &a, int val)
{
for (int i = 0; i < a.size(); i++)
{
if (a[i] == val)
return &a[i];
}
return 0;
}
//int* find(vector<int> &a, int val)
//{
// for (int i = 0; i < a.size(); i++)
// {
// if (a[i] == val)
// return &a[i];
// }
// return 0;
//}
int main(int argc, char* argv[])
{
vector<int> aa(10,0);
for (int i = 0; i < 10; i++)
{
aa.push_back(i);
}
int *p = find(aa, 5);
cout << *p << endl;
system("pause");
return 0;
}
3 从标准输入设备读取string元素,保存进vector并排序,最后再输出
cin.get()遇到空格会将当前所接受的字符结束:
输入as f(有空格)
读出
as
f
两个字符流。
在本题目中,输入as f,输出asf(因为没检测到回车)
若想接受空格,请使用getline()(待补充)
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
int main()
{
string word;
vector<string> text;
while (cin >> word)
{
text.push_back(word);
if (cin.get() == '\n')
break;
}
sort(text.begin(), text.end());
for (int i = 0; i < text.size(); i++)
{
cout << text[i] << " ";
}
cout << endl;
system("pause");
}
4 输入数组,长度为n,输入a[n]
可能a[100]扩展的数量不够,选择:
int n = 0;
cin >> n;
int *a = new int[n]; //创建长为n的数组
for (int i = 0; i < n; i++)
{
cin >> a[i];
}
5 输入字符串s和长度n
int n;
cin >> n;
string s;
cin >> s;
6 十进制转2进制、转16进制(有bug)
int decToBin(int dec)
{
int result = 0, temp = dec, j = 1;
while (temp)
{
result = result + j * (temp % 2);
temp = temp / 2;
j = j * 10;
}
return result;
}
int decTohex(int dec)
{
int result = 0, temp = dec, j = 1;
while (temp)
{
result = result + j * (temp % 16);
temp = temp / 16;
j = j * 10;
}
return result;
}