数字排列

标题:数字排列 | 时间限制:1秒 | 内存限制:262144K | 语言限制:不限
小明负责公司年会,想出一个趣味游戏:
屏幕给出1~9中任意4个不重复的数字,大家以最快时间给出这几个数字可拼成的数字从小到大排列位于第N位置的数字,其中N为给出的数字中最大的(如果不到这么多个数字则给出最后一个即可)。
注意:
1)2可以当做5来使用,5也可以当做2来使用进行数字拼接,且屏幕不能同时给出2和5;
2)6可以当做9来使用,9也可以当做6来使用进行数字拼接,且屏幕不能同时给出6和9。

#include <algorithm>
#include <iostream>
#include <string>
#include <vector>
using namespace std;

#define N 4

vector<int> readLine()
{
	string line;
	cin >> line;
	size_t left = 0;
	size_t pos = 0;
	vector<int> arr;
	while ((pos = line.find(",", left)) != string::npos) 
    {
		arr.push_back(stoi(line.substr(left, pos - left)));
		left = pos + 1;
	}
	if (left < line.size()) 
    {
		arr.push_back(stoi(line.substr(left)));
	}

	sort(arr.begin(), arr.end());
	return arr;
}

bool check(vector<int> d)
{
	for (int i = 0; i < N; ++i) 
    {
		if (d[i] < 1 || d[i] > 9) 
        {
			return false;
		}	
	}
		
	if (d[0] == d[1] || d[1] == d[2] || d[0] == d[2])
		return false;

	auto cnt1 = 0;
	auto cnt2 = 0;
	for (int i = 0; i < N; ++i) 
    {
		if (d[i] == 2 || d[i] == 5)
			cnt1 += 1;
		if (d[i] == 6 || d[i] == 9)
			cnt2 += 1;
	}

	if (cnt1 == 2 || cnt2 == 2)
		return false;

	return true;
}

int main()
{
	auto data = readLine();
	if (data.size() < 4) 
    {
		cout << -1 << endl;
		return 0;
	}
	int midValue = data[3];
	if (!check(data)) 
    {
		cout << -1 << endl;
	}
	else 
    {
		vector<int> result = { data[0], data[1], data[2], data[3] };
		for (int i = 0; i < N; ++i) 
        {
			if (data[i] == 2) 
            {
				result.push_back(5);
			}
			if (data[i] == 5) 
            {
				result.push_back(2);
			}
			if (data[i] == 6) 
            {
				result.push_back(9);
			}
			if (data[i] == 9) 
            {
				result.push_back(6);
			}
		}
        
		for (int i = 0; i < N; ++i) 
        {
			for (int j = 0; j < N; ++j) 
            {
				if (data[i] == data[j])
					continue;

				result.push_back(data[i] * 10 + data[j]);
				if (data[i] == 2) 
                {
					result.push_back(5 * 10 + data[j]);
				} 
				if (data[i] == 5) 
                {
					result.push_back(2 * 10 + data[j]);
				} 
				if (data[i] == 6) 
                { 
					result.push_back(9 * 10 + data[j]);
				} 
				if (data[i] == 9) 
                {
					result.push_back(6 * 10 + data[j]);
				}
				if (data[j] == 2) 
                {
					result.push_back(data[i] * 10 + 5);
				} 
				if (data[j] == 5) 
                {
					result.push_back(data[i] * 10 + 2);
				} 
				if (data[j] == 6) 
                {
					result.push_back(data[i] * 10 + 9);
				} 
				if (data[j] == 9) 
                {
					result.push_back(data[i] * 10 + 6);
				}	
			}
		}

		sort(result.begin(), result.end());
		cout << result[midValue - 1] << endl;
	}
		
	return 0;
}


全部评论

相关推荐

大方的大熊猫准备进厂:1.教育背景:你希望从事什么专业的工作你的主修课就是什么;成绩优秀是你应该做的,没什么可描述的,成绩不优秀也许人家在大学忙着创业呢?(成绩优秀不一定是好事,只能说明多元化的大学你上成了高中,没有真正上明白大学,反而体现了你死板,不爱社交,没有别的突出能力) 2.实践经历:你想表达的意思没有说清楚。你是说你会个性化服务,还是你有实习经历。如果没有带来,经济收益,表彰,更好的发展前景,那你还不如说说提升了自己哪些技能。你说有人给你送锦旗我都能明白你优秀,但是你说你会xxxx,你说这话谁信,证据呢。 3.入伍经历:你描述的就是你的工作职责或者你应该做的,并没有体现出来你把这个事情做好了,而且入伍经历并不能证明你能干好你要应聘的工作,不如只写经历其余所有内容都不写。 4.荣誉技能:重点突出一下,但不要过多描述,这些荣誉的含金量懂得都懂。 重点:你要应聘什么工作(具体岗位,实习生不具体),你的期望薪资
点赞 评论 收藏
分享
05-12 17:00
门头沟学院 Java
king122:你的项目描述至少要分点呀,要实习的话,你的描述可以使用什么技术,实现了什么难点,达成了哪些数字指标,这个数字指标尽量是真实的,这样面试应该会多很多,就这样自己包装一下,包装不好可以找我,我有几个大厂最近做过的实习项目也可以包装一下
点赞 评论 收藏
分享
评论
点赞
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务