当前位置:   article > 正文

【算法练习】小红书240317暑期实习笔试_塔子哥在整理自己博客上发布的题解时,会发现,每过一段时间,都会随机有一个题解点

塔子哥在整理自己博客上发布的题解时,会发现,每过一段时间,都会随机有一个题解点

【算法练习】——小红书240317暑期实习笔试

T1

题目描述:
塔子哥是一个卡牌游戏主播。他经常去网络上发布关于游戏的卡牌研究攻略。游戏中有一张牌叫做碾压墙,可以消灭敌方最左边和最右边的随从,另一张牌做致命射击,可以随机消灭一个敌方随从。 如果塔子哥使用两张致命射击恰好消灭了敌方最左边和最右边的随从(恰好造成了一张碾压墙的效果),就会有人在评论区发布“碾压墙”,注意:两张致命射击的结算有先后顺序,即两张致命射击不会消灭同一个敌方随从。 现在有
个敌方随从,塔子哥想知道她使用两张致命射击后,恰好造成一张碾压墙的效果的概率是多少,你的答案请四舍五入保留10位小数。

输入描述
第一行一个正整数n。

输出描述
一个保留10位小数的答案。

样例输入

2
  • 1

样例输出

1.0000000000
  • 1

Java实现:

public class KaPai {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n=in.nextInt();
        //因为要保留10位小数,所以只能使用BigDecimal类
        BigDecimal n1 = new BigDecimal(n);
        BigDecimal n2 = new BigDecimal(n - 1);
        BigDecimal fenmu = n1.multiply(n2);
        BigDecimal fenzi = new BigDecimal(2);
        BigDecimal res = fenzi.divide(fenmu, 10, RoundingMode.HALF_UP);
        System.out.println(res.toPlainString());
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

笔记:
BigDecimal的使用:

构造一个BigDecimal对象:
BigDecimal(int)
BigDecimal(llong)
BigDecimal(String)
BigDecimal.valueOf(double)
方法描述:
加减乘除:
add(BigDecimal)        BigDecimal对象中的值相加,然后返回这个对象,原对象不变。 
subtract(BigDecimal)   BigDecimal对象中的值相减,然后返回这个对象,原对象不变。 
multiply(BigDecimal)   BigDecimal对象中的值相乘,然后返回这个对象,原对象不变。 
divide(BigDecimal)     BigDecimal对象中的值相除,然后返回这个对象,原对象不变。 
转为字符串:
toString()                将BigDecimal对象的数值转换成字符串(科学计数法,也就是带指数)。 
toPlainString()           将BigDecimal对象的数值转换成字符串(不带指数)。 
转为其它类型:
doubleValue()            将BigDecimal对象中的值以双精度数返回。 
floatValue()             将BigDecimal对象中的值以单精度数返回。 
longValue()              将BigDecimal对象中的值以长整数返回。 
intValue()               将BigDecimal对象中的值以整数返回。
四舍五入:
setScale() 				参数1表示保留几位小数,参数2为RoundingMode.XXX表示舍入方式,HALF_UP表示四舍五入
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

T2

题目描述:
​ 塔子哥需要设计一套推荐算法。 该算法的核心思想如下,首先给定一个商品清单,其中有每个商品所包含的关键词属性,然后给出用户最近搜索过的一些关键词,请你将包含用户搜索过的更多的关键词的商品排在用户目录的前面。

如果两个商品关键词数量相同,则按商品出现的顺序排序。

输入描述:
第一行输入一个正整数n,q,代表商品数量、用户搜索的关键词数量。
第二行输入q个互不相同的、仅由小写文母组成的字符串,代表用户搜索过的关键词。
接下来的2*n行,每两行描述一个商品。
第一行输入一个仅由小写字母组成的字符围name和一个正整数mi,代表商品的名称和商品包含的关键词属性数量。
第二行输入mi个互不相同的、仅由小写字母组成的字符串,代表每个商品的属性。
所有的mi之和不超过30000 保证所有字符串长度不超过 20,所有商品的名称互不相同。

输出描述:
按照题意顺序输出商品。

样例输入:

2 5
red book game music sigma
mozart 3
book classic music
arcaea 4
red music game hard
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

样例输出:

arcaea
mozart
  • 1
  • 2

思路:
模拟、哈希表、自定义排序

Java实现:


public class Recommend {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        int m = in.nextInt();
        HashSet<String> keyWords=new HashSet<>();
        for(int i=0;i<m;i++){
            keyWords.add(in.next());
        }
        ArrayList<Goods> array=new ArrayList<>();
        for(int i=0;i<n;i++){
            String name=in.next();
            int count=in.nextInt();
            Goods goods = new Goods(name,0);
            for(int j=0;j<count;j++){
                String now_key=in.next();
                if(keyWords.contains(now_key)){
                    goods.hit++;
                }
            }
            array.add(goods);
        }
        array.sort(new Comparator<Goods>() {
            @Override
            public int compare(Goods o1, Goods o2) {
                return o2.hit-o1.hit;
            }
        });
        for(int i=0;i<n;i++){
            System.out.println(array.get(i).name);
        }
    }
}
class Goods{
    public String name;
    public int hit;
    public Goods(String name,int hit){
        this.name=name;
        this.hit=hit;
    }
}

别人的写法
//public class Recommend{
//    public static void main(String[] args) {
//        Scanner in = new Scanner(System.in);
//        int n=in.nextInt();
//        int m=in.nextInt();
//        Set<String> set=new HashSet<>();
//        for(int i=0;i<m;i++){
//            set.add(in.next());
//        }
//        List<String> li=new ArrayList<>();
//        HashMap<String,Integer> map=new HashMap<>();
//        for(int i=0;i<n;i++){
//            String name=in.next();
//            li.add(name);
//            map.put(name,0);
//            int k=in.nextInt();
//            for(int j=0;j<k;j++){
//                if(set.contains(in.next())){
//                    map.put(name,map.get(name)+1);
//                }
//            }
//        }
//        Collections.sort(li,(a,b)->{
//            return map.get(b)-map.get(a);
//        });
//        for(int i=0;i<n;i++){
//            System.out.println(li.get(i));
//        }
//    }
//}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75

T3

题目描述:
​ 塔子哥在整理自己博客上发布的题解时,会发现,每过一段时间,都会随机有一个题解点赞数量加1(每个题解被点赞的概率是相同的)。
现在塔子哥想知道,当第一次出现所有题解点赞数量均为偶数时,所有题解的总赞数之和的期望是多少?

输入描述:
第一行输入一个正整数n,代表塔子哥发布的题解数量;
第二行输入n个非负整数ai代表当日每个题解的点赞数;
1 ≤ n ≤ 1 0 5 1\leq n\leq10^5 1n105
0 ≤ a i ≤ 1 0 9 0\leq a_i\leq10^9 0ai109

输出描述:
输出期望对 1 0 9 + 7 10^9+7 109+7取模后的值。

样例输入:

2
1 2
  • 1
  • 2

样例输出:

6
  • 1

说明:
有1/2的概率总赞数为4,1/4的概率为6,1/8的概率为8…以此类推,最终答案收敛于6。
此题需要用到期望DP,还不会,待学习

参考:
https://zhuanlan.zhihu.com/p/689815395
https://blog.csdn.net/qq_35868412/article/details/89029288
https://blog.csdn.net/m0_59869090/article/details/122599165

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/681942
推荐阅读
相关标签
  

闽ICP备14008679号