【7-6 电话聊天狂人 (30 分)

给定大量手机用户通话记录,找出其中通话次数最多的聊天狂人。

输入格式:
输入首先给出正整数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;
	}

猜你喜欢

转载自blog.csdn.net/weixin_53021364/article/details/121878809