题目一:第一个没有出现的正数
给定一个数组,从 1到n,找出数组中第一个没出现的正数。
例如:
给定[1,2,0]
,则返回 3。
给定[3,4,-1,1]
,则返回 2。
注意:
算法需要 O(n)的时间复杂度以及线性的空间复杂度。
输入格式
第一行输入整数 n(n≤106),接下来一行输入数组A[n]
。
输出格式
输出第一个没出现的正数。
样例输入
5 4 2 0 1 4
样例输出
3
提示:hash
代码:
import java.util.HashSet;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in =new Scanner(System.in);
int num=in.nextInt();
int []a=new int[num];
HashSet<Integer> set=new HashSet<Integer>();
for(int i=0;i<num;i++) {
a[i]=in.nextInt();
set.add(a[i]);
}
for(int i=1;i<=num;i++) {
if(set.add(i)) {
System.out.println(i);
break;
}
}
}
}
题目二:两数之和
给定一个数组 numberi,找到两个数,使得他们的和为一个给定的数值target。
其中:number[index1]+number[index2]==target。
注意:index1 必须小于 index2 且不能为 0。假设每一组输入只有唯一的一组解。
例如,对于数组 [2,7,11,15]和 target=9,index1 的值为 1,index2的值为2。
输入格式
第一行输入一个整数 n(1≤n≤500),接下来的两行分别输入nnn 个整数组成的数组 numberi(0≤numberi≤1000) 和一个整数target(0≤target≤1000)
输出格式
输出一行由空格分隔的两个整数 index1 和 index2。注意,下标从1 开始。
样例输入
3 5 75 25 100
样例输出
2 3
代码:
import java.util.HashMap;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in =new Scanner(System.in);
int num=in.nextInt();
int []a=new int[num];
for(int i=0;i<num;i++) {
a[i]=in.nextInt();
}
int target=in.nextInt();
int []result=twoSum(a,target);
System.out.print(result[0]+" "+result[1]);
}
// 使用HashMap(查找的时间复杂度为O(1))
// 由题目假设知只有一对数满足该情况,故每个数都是唯一的,不存在重数的情况
public static int[] twoSum(int[] numbers, int target) {
if (numbers != null) {
HashMap<Integer, Integer> num_map = new HashMap<>();
for (int i = 0; i < numbers.length; i++) {
if (num_map.containsKey(numbers[i])) {
int index = num_map.get(numbers[i]);
int[] result = { ++index, ++i };
return result;
} else {
num_map.put(target - numbers[i], i);
}
}
}
return null;
}
}