PTA用java实现悄悄关注

7-20 悄悄关注 (25 分)

新浪微博上有个“悄悄关注”,一个用户悄悄关注的人,不出现在这个用户的关注列表上,但系统会推送其悄悄关注的人发表的微博给该用户。现在我们来做一回网络侦探,根据某人的关注列表和其对其他用户的点赞情况,扒出有可能被其悄悄关注的人。

输入格式:

输入首先在第一行给出某用户的关注列表,格式如下:

人数N 用户1 用户2 …… 用户N

其中N是不超过5000的正整数,每个用户ii=1, ..., N)是被其关注的用户的ID,是长度为4位的由数字和英文字母组成的字符串,各项间以空格分隔。

之后给出该用户点赞的信息:首先给出一个不超过10000的正整数M,随后M行,每行给出一个被其点赞的用户ID和对该用户的点赞次数(不超过1000),以空格分隔。注意:用户ID是一个用户的唯一身份标识。题目保证在关注列表中没有重复用户,在点赞信息中也没有重复用户。

输出格式:

我们认为被该用户点赞次数大于其点赞平均数、且不在其关注列表上的人,很可能是其悄悄关注的人。根据这个假设,请你按用户ID字母序的升序输出可能是其悄悄关注的人,每行1个ID。如果其实并没有这样的人,则输出“Bing Mei You”。

输入样例1:

10 GAO3 Magi Zha1 Sen1 Quan FaMK LSum Eins FatM LLao
8
Magi 50
Pota 30
LLao 3
Ammy 48
Dave 15
GAO3 31
Zoro 1
Cath 60

输出样例1:

Ammy
Cath
Pota

输入样例2:

11 GAO3 Magi Zha1 Sen1 Quan FaMK LSum Eins FatM LLao Pota
7
Magi 50
Pota 30
LLao 48
Ammy 3
Dave 15
GAO3 31
Zoro 29

输出样例2:

Bing Mei You

思路:

   此题:想法很简单:本想用map后来感觉map也不一定简单,所以还是用的最基础的数组来实现。

首先:抓住重点,第一行是连续输入,也就是一个字符串。而这个字符串中是否包含接下来我所输入的人名,如果不包含,并且它的点赞数也大于其平均数,就排序输出否则输出bing mie you.

解法一:用一个字符串数组来存放人名,一个整数数组来存放它的点赞数,然后满足条件加入集合中 ArrayList 然后调用排序方法,最后输出。

解法er:前面相同,然后是用TreeSet 来存放满足条件不用实现排序方法了。这里我强调一下,就是两种方式最后一个测试点都是超时。本想着用自定义构造方法来实现,发现依旧超时。

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Scanner;
public class Main {

    public static void main(String[] args) throws IOException{
        BufferedReader sr = new BufferedReader(new InputStreamReader(System.in));
        String s = sr.readLine(); //输入的一行带有多少个人,以及有多少个人名
        String string [] = s.split(" "); //这时候开始对空格进行分割  
        int m = Integer.parseInt(string[0]); //拿出第一个数字,也就是多少个人
        StringBuffer sss = new StringBuffer();  // 定义一个字符串  拿出除了输入的个数的那些人名
        for(int i=1;i<string.length;i++) {
            sss.append(string[i]+" ");  //得到 出一开始输入的总数,的人名
        }
        String ss = sss.toString(); //转换为字符串
        //拿出出个数以外的人名
        ArrayList list =  new ArrayList(); // 定义集合引用
        int n = Integer.parseInt(sr.readLine()); //第二次输入的个数 多少人名 和 点赞数
        int sum =0,avg=0; //总和  平均数
        int nums[] = new int[n];  //整数数组
        String attr[] = new String[n]; //第二次的人名
        for(int i=0;i<n;i++) {
            String line[] = sr.readLine().split(" ");  //第一行输入的是一个字符串 包含 人名 和点赞数
            attr[i] = line[0];//第二次输入的人名
            nums[i]=Integer.parseInt(line[1]);  //每个人名对应的点赞
            sum=sum+nums[i];  // 对其求和
        }
        avg = sum/n; //求平均
        for(int i=0;i<n;i++) {
            if(!ss.contains(attr[i])&&nums[i]>avg) {
                list.add(attr[i]); //满足条件 添加到集合中
            }
        }
        Collections.sort(list); //排序
        if(list.size()>0) {
            for(int i=0;i<list.size();i++) {
                System.out.println(list.get(i));
            }
        }else {
            System.out.println("Bing Mei You");
        } 
    }
}

解法二:

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.TreeSet;
public class Main {

    public static void main(String[] args) throws IOException{
        BufferedReader sr = new BufferedReader(new InputStreamReader(System.in));
        String s = sr.readLine(); //输入的一行带有多少个人,以及有多少个人名
        String string [] = s.split(" ");
        int m = Integer.parseInt(string[0]);
        StringBuffer sss = new StringBuffer();
        for(int i=1;i<string.length;i++) {
            sss.append(string[i]+" ");
        }
        String ss = sss.toString();
        TreeSet<String> set = new TreeSet<String>();
        String names[] = ss.split(" "); //把各个名字存进字符串数组当中
        int n = Integer.parseInt(sr.readLine());
        int sum =0,avg=0;
        int nums[] = new int[n];
        String attr[] = new String[n];
        for(int i=0;i<n;i++) {
            String line[] = sr.readLine().split(" ");
            attr[i] = line[0];//第二次输入的人名
            nums[i]=Integer.parseInt(line[1]);  //每个人名对应的关注度
            sum=sum+nums[i];
        }
        avg = sum/n;
        for(int i=0;i<n;i++) {
            if(!ss.contains(attr[i])&&nums[i]>avg) {
                set.add(attr[i]);
            }
        }
        if(set.size()>0) {
            for (String string2 : set) {
                System.out.println(string2);
            }
        }else {
            System.out.println("Bing Mei You");
        }
        
    }
}
 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值