算法1
-
1、开一个数组
f[]
记录i
数字是否出现过 -
2、由于重号只有一个,则输入所有数时,若
f[i]
为true
,则表示该数为重号 -
3、由于断号只有一个,则从最小值
minv
遍历到最大值maxv
,若f[i]
为false
,则表示该数为断号
时间复杂度 $O(N)$
Java 代码
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
public class Main {
static int N = 1000010;
static boolean[] f = new boolean[N];
static int cid ;
static int did ;
public static void main(String[] args) throws IOException {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(reader.readLine().trim());
int maxv = Integer.MIN_VALUE;
int minv = Integer.MAX_VALUE;
while(n -- > 0)
{
String[] s1 = reader.readLine().split(" ");
for(int i = 0;i < s1.length;i++)
{
int t = Integer.parseInt(s1[i]);
maxv = Math.max(maxv, t);
minv = Math.min(minv, t);
if(f[t]) cid = t;
f[t] = true;
}
}
for(int i = minv ;i <= maxv ;i ++)
{
if(!f[i])
{
did = i;
break;
}
}
System.out.println(did + " " + cid);
}
}
算法2
-
1、通过对输入的编号进行排序
-
2、从小到大遍历
(1)由于重号只会出现一个,因此当a[i] == a[i - 1]
时,a[i]表示重号
(2)由于断号只会出现一个,因此一定会空缺一个数,则当a[i] == a[i - 1] + 2
时,a[i] - 1
表示断号
时间复杂度 O(klogk)
Java 代码
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
public class Main {
static int[] a = new int[100010];
static int k = 0;
public static void main(String[] args) throws IOException{
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(reader.readLine().trim());
while(n -- > 0)
{
String[] s1 = reader.readLine().split("\\s+");
for(int i = 0;i < s1.length;i++)
{
a[k ++] = Integer.parseInt(s1[i]);
}
}
Arrays.sort(a,0,k);
int res1 = -1;//断号(只会断一次)
int res2 = -1;//重号
for(int i = 1;i < k;i++)
{
if(a[i] == a[i - 1]) res2 = a[i];//重号
else if(a[i] == a[i - 1] + 2) res1 = a[i] - 1;//断号
}
System.out.println(res1 + " " + res2);
}
}
想问一下这里为什么要i从1开始啊,
for(int i = 1;i < k;i++)
{
if(a[i] == a[i - 1]) res2 = a[i];//重号
else if(a[i] == a[i - 1] + 2) res1 = a[i] - 1;//断号
}
可以请大佬帮忙看一下这个为什么不能通过吗?感觉没有什么问题啊~
import java.io.*;
import java.util.ArrayList;
import java.util.Collections;
public class Main{
static int n;
static ArrayList[HTML_REMOVED] q=new ArrayList[HTML_REMOVED]();
static BufferedReader rdBufferedReader=new BufferedReader(new InputStreamReader(System.in));
public static void main(String[] args) throws Exception{
n=Integer.parseInt(rdBufferedReader.readLine());
while(n–!=0) {
String[] strings=rdBufferedReader.readLine().split(” “);
for(int i=0;i<strings.length;i) {
q.add(Integer.parseInt(strings[i]));
}
}
Collections.sort(q);
int res1=0;
int res2=0;
for(int i=1;i<q.size();i) {
if(q.get(i)==q.get(i-1)) res2=q.get(i);
if(q.get(i)==q.get(i-1)+2) res1=q.get(i)-1;
}
System.out.println(res1+” “+res2);
}
}
判断断号重号那里,把==改成equals()方法就可以了
int t = Integer.parseInt(s1[i]);
带佬,这行为啥会错误,搞不懂
整个代码发出来
就是你上面的代码整个拷贝上去,然后有一个 Non Zero Exit Code 错误
好奇怪
原因是样例数据是用两个空格隔开,一开始代码中
String[] s1 = reader.readLine().split(" ");
,这里只是用一个空格隔开,所以就会报错,可是后台的数据是用一个空格隔开,所以上面代码是没错的,也可以用一下用正则表达式,现在写成String[] s1 = reader.readLine().split("\\s+");
形式,两个情况都适用谢谢带佬