每日一题(36)

61 篇文章 1 订阅
41 篇文章 0 订阅

链接:https://www.nowcoder.com/questionTerminal/ceb89f19187b4de3997d9cdef2d551e8?source=relative
来源:牛客网

编程题]电话号码
热度指数:514时间限制:1秒空间限制:32768K
算法知识视频讲解

上图是一个电话的九宫格,如你所见一个数字对应一些字母,因此在国外企业喜欢把电话号码设计成与自己公司名字相对应。例如公司的Help Desk号码是4357,因为4对应H、3对应E、5对应L、7对应P,因此4357就是HELP。同理,TUT-GLOP就代表888-4567、310-GINO代表310-4466。
NowCoder刚进入外企,并不习惯这样的命名方式,现在给你一串电话号码列表,请你帮他转换成数字形式的号码,并去除重复的部分。

输入描述:
输入包含多组数据。

每组数据第一行包含一个正整数n(1≤n≤1024)。

紧接着n行,每行包含一个电话号码,电话号码仅由连字符“-”、数字和大写字母组成。
没有连续出现的连字符,并且排除连字符后长度始终为7(美国电话号码只有7位)。

输出描述:
对应每一组输入,按照字典顺序输出不重复的标准数字形式电话号码,即“xxx-xxxx”形式。

每个电话号码占一行,每组数据之后输出一个空行作为间隔符。
示例1
输入
12
4873279
ITS-EASY
888-4567
3-10-10-10
888-GLOP
TUT-GLOP
967-11-11
310-GINO
F101010
888-1200
-4-8-7-3-2-7-9-
487-3279
4
UTT-HELP
TUT-GLOP
310-GINO
000-1213
输出
310-1010
310-4466
487-3279
888-1200
888-4567
967-1111

000-1213
310-4466
888-4357
888-4567‘
分析:先用map将stirng和int 传进去,再用vector的sort进行排序,最后再输出。
需要注意的坑 迭代器失效的问题,


#include <iostream>
#include<algorithm>
#include <vector>
#include <string>
#include <map>
#define MAX 10000000//是数字的字典序
using namespace std;//计划有变,有map键值对来排序

int cmp(const pair<string, int> a, const pair<string, int> b) //用于排序的自定义函数
{
	return a.second > b.second;

}

vector<pair<string, int>> my_sort(map<string, int>& ipone_real, vector<string>& ipone)
{
	//用map插入会有去重的问题


	for (auto& e : ipone)
	{
		ipone_real.insert(pair<string, int>(e, MAX - atoi(e.c_str())));
	}
	//再根据second排序

	//把map的pair放到vector中利用vector的sort排序

	vector<pair<string, int>> ipone_last;
	for (auto& e : ipone_real)
	{
		ipone_last.push_back(e);
	}
	sort(ipone_last.begin(), ipone_last.end(), cmp);//对容器进行排序



	return ipone_last;
}

string change(string& word2)
{

	string word;
	string::size_type i = 0;
	for (auto e : word2)
	{
		if (e != '-')
			word.push_back(e);
	}

	for (auto& e : word)//对传入的修改
	{
		if (e >= 'A' && e <= 'Z')
		{
			if (e >= 'A' && e <= 'C')
				e = '2';
			if (e >= 'D' && e <= 'F')
				e = '3';
			if (e >= 'G' && e <= 'I')
				e = '4';
			if (e >= 'J' && e <= 'L')
				e = '5';
			if (e >= 'M' && e <= 'O')
				e = '6';
			if (e >= 'P' && e <= 'S')
				e = '7';
			if (e >= 'T' && e <= 'V')
				e = '8';
			if (e >= 'W' && e <= 'Z')
				e = '9';
		}

	}

	return word;
}
int main()
{

	int num1;

	while (cin >> num1)
	{
		vector<string> ipone;
		string word;
		while (num1)
		{
			cin >> word;
			ipone.push_back(word);
			num1--;
		}
		for (auto& e : ipone)
		{
			e = change(e);//遍历ipone元素,对ipone的元素进行修改
		}

		map<string, int> ipone_real;
		vector<pair<string, int>> ipone_last;
		ipone_last = my_sort(ipone_real, ipone);


		for (auto& e : ipone_last)
		{

			string nnew = e.first;
			nnew += '-';//感觉效率很低

			for (int i = nnew.size() - 2; i > 2; i--)
			{

				nnew[i + 1] = nnew[i];
			}
			nnew[3] = '-';//加入一个-可能会导致迭代器失效

			e.first = nnew;
			cout << e.first << endl;
		}
		cout << endl;

	}
}

(感觉这个代码效率不高,可以用set代替map进行重构)

链接:https://www.nowcoder.com/questionTerminal/11cc498832db489786f8a03c3b67d02c
来源:牛客网

[编程题]求和
热度指数:16806时间限制:1秒空间限制:32768K
算法知识视频讲解
输入两个整数 n 和 m,从数列1,2,3…n 中随意取几个数,使其和等于 m ,要求将其中所有的可能组合列出来

输入描述:
每个测试输入包含2个整数,n和m

输出描述:
按每个组合的字典序排列输出,每行输出一种组合
示例1
输入
5 5
输出
1 4
2 3
5
分析:这道题适合用dfs递归求解。刚好这学期算法学过代码如下。


#include<iostream>
#include<vector>
using namespace std;
void need(int n, int m, vector<int>& v, int beg) {

	if (m == 0) {
		for (int i = 0; i < v.size(); i++) {
			i == 0 ? cout << v[i] : cout << " " << v[i];
		}
		cout << endl;
	}
	for (int i = beg; i <= n && i <= m; i++) {
		v.push_back(i);
		need(n, m - i, v, i + 1);
		v.pop_back();
	}
}
int main() {
	int n, m;
	while (cin >> n) {
		cin>>m;
		vector<int>v;
		need(n, m, v, 1);
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值