题目
给定升序排序的数组,如果数组有 2 个或 2 个以上相同的数字,去掉他们,直到剩下 2 个为止
例如:
数组 A[] = [1,1,1,2,2,3]
你的算法需要返回新数组的长度 5,此时 A为 [1,1,2,2,3]。
输入格式
第一行输入一个不超过 200 的数字 n,第二行输入 A[n]。
输出格式
输出新数组的长度。
样例输入
6
1 1 1 1 3 3
我给的代码
import java.util.ArrayList;
import java.util.Scanner;
public class Main {
public static void main(String args[]) {
Scanner scanner = new Scanner(System.in);
ArrayList<Integer> list = new ArrayList<>();
int n = scanner.nextInt();
int k = 0; //标志数
int p; //待输入的数
int total = 0; //统计输入的数在整个数组中出现的次数
for (int i = 0; i < n; i++) {
p = scanner.nextInt();
//k和p的比较其实就是 输入的数和前一个数进行比较
if (k == p) {
total++;
k = p;
}
if (k != p) {
total = 1;
k = p;
}
if (total <= 2) {
list.add(p);
}
}
System.out.println(list.size());
}
}
我的思路
Scanner scanner = new Scanner(System.in);
ArrayList<Integer> list = new ArrayList<>();
int n = scanner.nextInt();
以上的代码不加解释,主要解释接下来的代码
int k = 0; //标志数
int p; //待输入的数
int total = 0; //统计输入的数在整个数组中出现的次数
k作为标志数,标志的是在数组中相对于p之前的一个数。total表示的是输入的数p在整个数组中出现的个数。
其实严格意义上并没有出现一个数组,只是因为这道题的题意规定提供的是一个已经升好序的数组了。
for (int i = 0; i < n; i++) {
p = scanner.nextInt();
//k和p的比较其实就是 输入的数和前一个数进行比较
if (k == p) {
total++;
k = p;
}
if (k != p) {
total = 1;
k = p;
}
if (total <= 2) {
list.add(p);
}
}
这段代码表示的是把p一个一个的和前一个数,也就是标志数k进行比较。
如果p和前一个数相等,total加一,再把这个p赋值给k作为下一个数p的标志数。
如果标志数k和当前比较的数p不相等,那么就将total重置为1。同样的,把这个p赋值给k作为下一个数p的标志数。
因为题目已经说明是给定的升序排序的数组,所以说如果当前数p和上一个数k不同的话,那么p之后所有的数也肯定和k不同,所以不用担心total的数值。
最后,将total小于等于2的数全部放入之前申明的集合list中,输出list的大小即是最终的答案。