小红书2020校招算法笔试题卷一

小红书2020校招算法笔试题卷一

字符串倒序

薯队长带着小红薯参加密室逃脱团建游戏,首先遇到了反转游戏,小红薯们根据游戏提示收集了多个单词线索,并将单词按要求加一个空格组 成了句子,最终要求把句子按单词反转解密。 说明:收集的时候单词前后可能会有多个空格,反转后单词不能有多个空格,具体见输入输出样例。

输入描述:
输入一个字符串。包含空格和可见字符。长度<=100000。
输出描述:
输出一个字符串,表示反转后结果。
示例1
输入

the	sky	is												blue!

输出

blue! is sky the

:经常出现,比较简单

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String a = scanner.nextLine();
        int flag = 0;
        String b="";
        String str[]=a.trim().split(" +");
        for(int i=str.length-1;i>0;i--){
            b=b+str[i]+" ";
        }
        b=b+str[0] ;
        System.out.println(b);  
    }
}

笔记精选

薯队长写了n篇笔记,编号从1~n,每篇笔记都获得了不少点赞数。
薯队长想从中选出一些笔记,作一个精选集合。挑选的时候有两个规则:
1.不能出现连续编号的笔记。
2.总点赞总数最多
如果满足1,2条件有多种方案,挑选笔记总数最少的那种

输入描述:
输入包含两行。第一行整数n表示多少篇笔记。 第二行n个整数分别表示n篇笔记的获得的点赞数。
(0<n<=1000, 0<=点赞数<=1000)
输出描述:
输出两个整数x,y。空格分割。
x表示总点赞数,y表示挑选的笔记总数。
示例1
输入

4
1 2 3 1

输出

4 2

:动态规划找公式,由于不能出现连续, 容易想到想到dp[i] (此处dp值为点赞数)是肯定与dp[i-2]和dp[i-3]之间有关系,如果与dp[i-4]有直接关系意味着跳过了dp[i-2]会导致点赞数变少,情况错误
dp[i] = max(dp[i-2],dp[i-3])+ mm[i](当前点赞数)
然而还要考虑比笔记数则 dp[x][0] 为 点赞数 dp[x][1]为笔记数

  1. 当 dp[i-2][0] 与 dp[i-3][0] 不等时:
    dp[i][0] = max(dp[i-2][0],dp[i-3][0])+ mm[i](当前点赞数)
    dp[i][1]= dp【x】[1] 对应的天数 + 1
  2. 当 dp[i-2][0] 与 dp[i-3][0] 相等时:
    dp[i][0] = dp【x】[0] +mm[i] x对应的天数小的
    dp[i][1]= min (dp[i-2][1] , dp[i-3][1]) + 1
  3. 对0的考虑
    这种情况我一开始忽略了导致最后一组数据 n= 999 过不了
    在这里插入图片描述
    发现他含有0 ,0点赞数每增加但是笔记数+1了这是我们不想要的。跟上面情况一样只是天数不加1。把0对应位置的 index(0)-2 ,index(0)- 3的数据比较后传到0位置来。

输出和初始化大家想一下就明白了。

题目还算好想,考虑不全的话看到错误也能改出来。代码写的很多,但是思想简单,建议大家自己写哈。

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int a = scanner.nextInt();
        scanner.nextLine();
        String b = scanner.nextLine();
        String []arr=b.split(" +");
        int []mm = new int[a];
        for(int i=0;i<a;i++)
            mm[i]= Integer.parseInt(arr[i]);
        int [][]dp = new int[a][2];
        for(int i=0;i<a;i++){
//             等于0等情况  把dp[i-1] dp[i-2]按条件过度过来但是步数不加
//             不然有一组999 的案例里面含有0过不了
            if(mm[i]==0){
//                System.out.println(i+"含有0");
                if(dp[i-2][0]<dp[i-3][0]){
                    dp[i][0]=dp[i-3][0]+mm[i];
                    dp[i][1]=dp[i-3][1] ;
                }else if(dp[i-2][0]>dp[i-3][0]){
                    dp[i][0]=dp[i-2][0]+mm[i];
                    dp[i][1]=dp[i-2][1] ;
                }else{
                    if(dp[i-2][1]<dp[i-3][1]){
                        dp[i][0]=dp[i-2][0]+mm[i];
                        dp[i][1]=dp[i-2][1] ;
                    }else{
                        dp[i][0]=dp[i-3][0]+mm[i];
                        dp[i][1]=dp[i-3][1] ;
                    }
                }
                continue;
            }
            if(i<2){
                dp[i][0]=mm[i];
                dp[i][1]=1;
            }else if(i==2){
                dp[i][0]=dp[0][0]+mm[i];
                dp[i][1]=2;
            }
            else{
                if(dp[i-2][0]<dp[i-3][0]){
                    dp[i][0]=dp[i-3][0]+mm[i];
                    dp[i][1]=dp[i-3][1]+1;
                }else if(dp[i-2][0]>dp[i-3][0]){
                    dp[i][0]=dp[i-2][0]+mm[i];
                    dp[i][1]=dp[i-2][1]+1;
                }else{
                    if(dp[i-2][1]<dp[i-3][1]){
                        dp[i][0]=dp[i-2][0]+mm[i];
                        dp[i][1]=dp[i-2][1]+1;
                    }else{
                        dp[i][0]=dp[i-3][0]+mm[i];
                        dp[i][1]=dp[i-3][1]+1;
                    }
                }
            }
        }
      
        if(dp[a-1][0]>dp[a-2][0])
            System.out.println(dp[a-1][0]+" "+dp[a-1][1]);
        else if(dp[a-1][0]<dp[a-2][0])
            System.out.println(dp[a-2][0]+" "+dp[a-2][1]);
        else {
            if( dp[a-1][1]>=dp[a-2][1])
                System.out.println(dp[a-2][0]+" "+dp[a-2][1]);
            else
                System.out.println(dp[a-1][0]+" "+dp[a-1][1]);
        }
    }
}

击败魔物

没什么思路 (太菜了

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值