1、单生狗
1)题目
“单身狗”是中文对于单身人士的一种爱称。本题请你从上万人的大型派对中找出落单的客人,以便给予特殊关爱。
输入格式:
输入第一行给出一个正整数 N(≤50000),是已知夫妻/伴侣的对数;随后 N 行,每行给出一对夫妻/伴侣——为方便起见,每人对应一个 ID 号,为 5 位数字(从 00000 到 99999),ID 间以空格分隔;之后给出一个正整数 M(≤10000),为参加派对的总人数;随后一行给出这 M 位客人的 ID,以空格分隔。题目保证无人重婚或脚踩两条船。
输出格式:
首先第一行输出落单客人的总人数;随后第二行按 ID 递增顺序列出落单的客人。ID 间用 1 个空格分隔,行的首尾不得有多余空格。
输入样例:
3 11111 22222 33333 44444 55555 66666 7 55555 44444 10000 88888 22222 11111 23333
输出样例:
5 10000 23333 44444 55555 88888
2)题目解读
题目要求我们先输入一个数字N,然后再输入N对 夫妻/伴侣 的对数。还要输入一个数字M,然后再输入M个ID 号。我们需要判断这些ID号是否成对匹配N对 夫妻/伴侣 中的ID号。并输出其中未匹配的ID号数量及ID号,要求ID号按递增顺序输出。
3)代码
import java.util.Arrays; import java.util.HashMap; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc=new Scanner(System.in); int n= Integer.parseInt(sc.nextLine()); String[][] arr=new String[n][2]; for (int i=0;i<arr.length;i++){ String s=sc.nextLine(); arr[i]=s.split(" "); } int m= Integer.parseInt(sc.nextLine()); String[] arr1;//去除夫妻/伴侣ID后保留再arr1数组中,再进行sort排序 String ss=sc.nextLine(); //从arr数组开始遍历,去找是否存在存在该对 夫妻/伴侣ID //若存在,则去除 for (int i=0;i<arr.length;i++){ if (ss.contains(arr[i][0])&&ss.contains(arr[i][1])){ ss=ss.replace(arr[i][0],""); ss=ss.replace(arr[i][1],""); } } String o="\\s+";//作为正则表达式: 表示一个或若干个空格 arr1=ss.split(o); Arrays.sort(arr1);//进行排序 boolean b=true; System.out.println(arr1.length); for (int i=0;i<arr1.length;i++){ if (b){ System.out.print(arr1[i]); b=false; }else { System.out.print(" "+arr1[i]); } } } }
2、电话聊天狂人
1)、题目
给定大量手机用户通话记录,找出其中通话次数最多的聊天狂人。
输入格式:
输入首先给出正整数N(≤105),为通话记录条数。随后N行,每行给出一条通话记录。简单起见,这里只列出拨出方和接收方的11位数字构成的手机号码,其中以空格分隔。
输出格式:
在一行中给出聊天狂人的手机号码及其通话次数,其间以空格分隔。如果这样的人不唯一,则输出狂人中最小的号码及其通话次数,并且附加给出并列狂人的人数。
输入样例:
4 13005711862 13588625832 13505711862 13088625832 13588625832 18087925832 15005713862 13588625832
输出样例:
13588625832 3
2)代码解读
题目给我们n对通话记录的号码,要求我们找出通话最多的通话狂人,输出其号码和通话次数,要是有多个通话次数的通话狂人,就输出最小的号码和通话次数以及有多少个和他通话次数相同的人。我们可以使用HashMap储存,再进行排序,这道题就会变得非常简单。
3)代码
import java.util.*; public class Main { public static void main(String[] args) { Scanner sc=new Scanner(System.in); int n= Integer.parseInt(sc.nextLine()); HashMap<String,Integer> map=new HashMap<>(); //输入 for (int i=0;i<n;i++){ String s=sc.nextLine(); String[] ss=s.split(" "); if (!map.containsKey(ss[0])){ map.put(ss[0],1); }else { map.put(ss[0],map.get(ss[0])+1); } if (!map.containsKey(ss[1])){ map.put(ss[1],1); }else { map.put(ss[1],map.get(ss[1])+1); } } //将map的entrySet放入list集合 List<Map.Entry<String,Integer>> list = new ArrayList<>(map.entrySet()); //使用lambda表达式进行比较器传递 //先比较该电话的拨打次数是否相同,降序排列 //再比较电话号码打大小,降序排列 list.sort((o1, o2) -> { if (o1.getValue().equals(o2.getValue())) { return o2.getKey().compareTo(o1.getKey()); } else//重写排序规则,小于0表示升序,大于0表示降序 return o2.getValue() - o1.getValue(); }); int count=0;//保存拨打号码次数相同的数量 int v=0; //第一次遍历无法比较,所有设置一个boolean判断区分 boolean b=true; //区别一种特殊情况:是否全部号码拨打次数都一样 boolean bb=true; String ss = null; //使用Iterator遍历list去找号码 Iterator<Map.Entry<String, Integer>> inter = list.iterator(); while(inter.hasNext()){ Map.Entry<String, Integer> item = inter.next(); String key = item.getKey(); int value = item.getValue(); if (b){ ss=key; v=value; count++; b=false; }else { //发现这个号码次数和上一个号码次数不同,即是最小号码 //或者是次数最大的号码,然后再进行if判断 if (v!=value){ bb=false; System.out.print(ss+" "); if (count==1){ System.out.print(v); }else { System.out.print(count); } break; } ss=key; count++; } } //如果全部号码拨打次数相同,则输出 if (bb){ System.out.println(ss+" "+v+" "+map.size()); } } }