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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值