解题思路
为了找到给定数组中第一个缺失的自然数,我们可以使用以下步骤:
-
解析输入:
- 将输入的字符串按逗号分割,转换为整数数组。
-
查找缺失的数字:
- 遍历数组,检查从 0 开始的每个数字是否在数组中存在。
- 如果某个数字不在数组中,则返回该数字。
-
处理边界情况:
- 如果所有数字都存在,则返回数组的最大值加一。
代码
#include <iostream>
#include <vector>
#include <sstream>
#include <unordered_set>
using namespace std;
class Solution {
public:
int findMissingNumber(const string& s) {
unordered_set<int> numSet;
stringstream ss(s);
string token;
// 将字符串转换为整数并存入集合
while (getline(ss, token, ',')) {
numSet.insert(stoi(token));
}
// 查找缺失的数字
for (int i = 0; i <= numSet.size(); i++) {
if (numSet.find(i) == numSet.end()) {
return i; // 返回第一个缺失的数字
}
}
return -1; // 理论上不会执行到这里
}
};
int main() {
Solution solution;
string input;
getline(cin, input); // 读取输入
cout << solution.findMissingNumber(input) << endl; // 输出缺失的数字
return 0;
}
import java.util.*;
public class Main {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
* @param s 输入的以逗号分隔的数字串
* @return int 缺失的数字
*/
public int findMissingNumber(String s) {
String[] strNums = s.split(",");
Set<Integer> numSet = new HashSet<>();
// 将字符串转换为整数并存入集合
for (String str : strNums) {
numSet.add(Integer.parseInt(str));
}
// 查找缺失的数字
for (int i = 0; i <= numSet.size(); i++) {
if (!numSet.contains(i)) {
return i; // 返回第一个缺失的数字
}
}
return -1; // 理论上不会执行到这里
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String input = sc.nextLine(); // 读取输入
Main solution = new Main();
System.out.println(solution.findMissingNumber(input)); // 输出缺失的数字
}
}
def find_missing_number(s: str) -> int:
# 将输入字符串转换为整数列表
nums = list(map(int, s.split(',')))
n = len(nums)
# 遍历从 0 到 n 的每个数字
for i in range(n + 1):
if i not in nums:
return i # 返回第一个缺失的数字
return -1 # 理论上不会执行到这里
# 示例用法
if __name__ == "__main__":
input_str = input() # 读取输入
print(find_missing_number(input_str)) # 输出缺失的数字
算法及复杂度
- 算法:遍历查找
- 时间复杂度:,其中 是数组的长度
- 空间复杂度:,用于存储数字集合