2018年南大计算机机试-2

2018年南大计算机机试-2

题目描述
2. Missing number

Given a positive integer n(n≤40), pick n-1 numbers randomly from 1 to n and concatenate them in random order as a string s, which means there is a missing number between 1 and n. Can you find the missing number?(Notice that in some cases the answer will not be unique, and in these cases you only need to find one valid answer.)

Examples:
Input: 20
81971112205101569183132414117
Output: 16
中文题意:
给定正整数n(n≤40),从1到n中随机选择n-1个数,并将它们以随机顺序连接为字符串s,这意味着在1和n之间有一个缺失的数字。你能找到那个缺失的数字吗?(请注意在某些情况下答案不唯一,此时你只需要找到一个有效的答案。

#include<iostream>
#include<string>
using namespace std;
int main(){
	int n;
	cin >> n;
	char str[100];
	int mark[100] = { 0 };
	cin >> str;
	int tmp1,tmp2, len = strlen(str);
	int sum = 0, flag = 0;//flag表示是否把最后一个字符算进去
	for (int i = 0; i < len-1; i++){//遍历从第一个字符到倒数第二个字符
		tmp1 = str[i] - '0';//当前字符的值
		tmp2 = (str[i] - '0') * 10 + (str[i + 1] - '0');//当前字符与下一个字符的值
		if (str[i + 1] == '0'){//如果i+1为0,则按照如下代码特殊处理,因为数字0必须与前一个数字配对
			mark[tmp2]++;
			i++;//跳过0
			sum++;//提取出的数值个数+1
			if (i == len - 1){//如果0是最后一个字符,那么最后一个字符已经被处理
				flag = 1;
			}
		}
		else{//如果当前字符的下一个字符不是0
			if (tmp2 <= n&&mark[tmp2]==0){//如果两个字符的数值在规定范围内且没有被处理过
				mark[tmp2]++;
				i++;//跳过第二个数字
				sum++;
				if (i == len - 1){//如果是最后一个字符,那么最后一个字符已经被处理
					flag = 1;
				}
			}
			else{//否则只存储当前字符
				cout << tmp1 << endl;
				mark[tmp1]++;
				sum++;
			}
		}
	}


	if (flag == 0){//最后一个字符没有被计算
		mark[str[len - 1] - '0'] = 1;
		sum++;
	}
	if (sum == n - 1){//如果刚好有n-1个数值,说明以上处理正确
		for (int i = 1; i <= n; i++){//输出没有被输入的数值
			if (mark[i] == 0){
				cout << i << endl;
				break;
			}
		}
	}
	else{
		cout << "error!" << endl;
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值