解题思路
这是一道查找丢失数字并进行组合的问题,主要思路如下:
-
问题分析:
- 原始数组包含1到10000的连续数字
- 丢失了三个数字,其余数字被打乱
- 需要找出丢失的数字并按从小到大拼接
- 计算拼接后的数字除以7的余数
-
解决方案:
- 使用标记数组记录出现的数字
- 遍历1到10000找出未出现的三个数字
- 将三个数字按顺序拼接成字符串
- 计算最终结果对7的余数
-
关键点:
- 使用内存数组标记已出现的数字
- 注意数字拼接后可能很大,需要考虑大数处理
代码
#include <iostream>
#include <vector>
#include <string>
using namespace std;
int findMissingNumbers() {
// 标记数组,记录出现的数字
vector<bool> seen(10001, false);
// 读入9997个数字
for (int i = 0; i < 9997; i++) {
int num;
cin >> num;
seen[num] = true;
}
// 找出未出现的三个数字
string result;
int count = 0;
for (int i = 1; i <= 10000 && count < 3; i++) {
if (!seen[i]) {
result += to_string(i);
count++;
}
}
// 计算对7的余数
return stol(result) % 7;
}
int main() {
cout << findMissingNumbers() << endl;
return 0;
}
import java.util.*;
public class Main {
public static int findMissingNumbers() {
// 标记数组,记录出现的数字
boolean[] seen = new boolean[10001];
Scanner sc = new Scanner(System.in);
// 读入9997个数字
for (int i = 0; i < 9997; i++) {
int num = sc.nextInt();
seen[num] = true;
}
// 找出未出现的三个数字
StringBuilder result = new StringBuilder();
int count = 0;
for (int i = 1; i <= 10000 && count < 3; i++) {
if (!seen[i]) {
result.append(i);
count++;
}
}
// 计算对7的余数,使用 Long 类型
return (int)(Long.parseLong(result.toString()) % 7);
}
public static void main(String[] args) {
System.out.println(findMissingNumbers());
}
}
def find_missing_numbers():
# 标记数组,记录出现的数字
seen = [False] * 10001
# 读入9997个数字
numbers = map(int, input().split())
for num in numbers:
seen[num] = True
# 找出未出现的三个数字
result = ''
count = 0
for i in range(1, 10001):
if not seen[i]:
result += str(i)
count += 1
if count == 3:
break
# 计算对7的余数
return int(result) % 7
# 主程序
print(find_missing_numbers())
算法及复杂度
- 算法:标记数组
- 时间复杂度:
-
为数字范围
- 空间复杂度:
- 需要标记数组存储出现的数字