给定大量手机用户通话记录,找出其中通话次数最多的聊天狂人。
输入格式:
输入首先给出正整数N(≤105 ),为通话记录条数。随后N行,每行给出一条通话记录。简单起见,这里只列出拨出方和接收方的11位数字构成的手机号码,其中以空格分隔。
输出格式:
在一行中给出聊天狂人的手机号码及其通话次数,其间以空格分隔。如果这样的人不唯一,则输出狂人中最小的号码及其通话次数,并且附加给出并列狂人的人数。
输入样例:
4
13005711862 13588625832
13505711862 13088625832
13588625832 18087925832
15005713862 13588625832
结尾无空行
输出样例:
13588625832 3
用Java写的,运行最后一项一直运行超时:
import java.util.Scanner;
public class Main {
public static void main(String args[]) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
X[] x = new X[2 * n];
for (int i = 0; i < x.length; i++) {
x[i] = new X("");// 给每个Xi都填充无效的对象
}
for (int i = 0; i < n; i++) {
int a = 2;
while (a-- > 0) {
// 每次存入两个
String num1 = scanner.next();
// String num2 = scanner.next();// 读取操作
// 两条字符串分别存入数组,若重复,则出现次数k++;
int j = 0, flag = 0;
while (x[j].k != 0) {
if (num1.equals(x[j].numString)) {
x[j].k++;// 若在已知数组内找到,则k++;
flag = 1;
break;
}
j++;// 遍历已知数组
}
if (flag == 0) {
// 如果都找不到,则在已知数组的j位上添加
x[j] = new X(num1);
x[j].k++;// 这就算出现过一次了,不要忘了给这个新的X对象的k++
}
}
}
//接下来开始找k的最大值,若不唯一,则输出并列数即有几个最大的k
int sum = 0;
int maxk = 0;
for (int i = 0; x[i].k > 0; i++) {
// 先查找最大下标
if (x[maxk].k < x[i].k) {
maxk = i;
}
}
for (int i = 0; x[i].k > 0; i++) {
// 再查找并列数
if (x[i].k == x[maxk].k) {
if (x[maxk].numString.compareTo(x[i].numString) > 0) {
// 当比maxi小时,让maxi等于它
maxk = i;
}
sum++;
}
}
if (sum > 1) {
System.out.println(x[maxk].numString + " " + x[maxk].k+" " + sum);
} else {
System.out.println(x[maxk].numString + " " + x[maxk].k);
}
scanner.close();
}
}
class X {
public String numString;
public int k = 0;
public X(String num) {
this.numString = num;
}