【2020牛客网笔试整理】小红书笔试题

薯队长写了一篇笔记草稿,请你帮忙输出最后内容。

1.输入字符包括,"(" , “)” 和 "<“和其他字符。
2.其他字符表示笔记内容。
3.()之间表示注释内容,任何字符都无效。 括号保证成对出现。
4.”<“表示退格, 删去前面一个笔记内容字符。括号不受”<"影响 。

简单来说,就是括号中的都去掉,<号前边的去掉;
这道题我的思路局限于遇到(,从这个下标开始找下一个),从而导致不能准确的判断出有一对以上的括号时是做法;

看了评论是将坐标记录下来,遇到)直接找到之前记录的坐标;

import java.util.Scanner;

/**
 * 薯队长写了一篇笔记草稿,请你帮忙输出最后内容。
 *  1.输入字符包括,"("    ,    ")"    和    "<"和其他字符。
 * 2.其他字符表示笔记内容。
 *  3.()之间表示注释内容,任何字符都无效。    括号保证成对出现。
 *  4."<"表示退格,    删去前面一个笔记内容字符。括号不受"<"影响    。
 */
public class Main {
    public static String removeString(String s){
        if(s==null){
            return null;
        }
        StringBuffer sb=new StringBuffer();
        int i=0;
        while (i<s.length()){
            if(s.charAt(i)=='('){
                int j=i;
                for(;j<s.length();j++){
                    sb.append(s.charAt(j));
                    if(s.charAt(j)==')'){
                        sb.delete(i,j+1);
                        i=j;
                        break;
                    }
                }
                i=j;

            }else if(s.charAt(i)=='<'){
                sb.deleteCharAt(sb.length()-1);
            }else {
                sb.append(s.charAt(i));
            }
            i++;
        }
        return sb.toString();
    }
    public static void main(String[] args) {
        Scanner scanner=new Scanner(System.in);
        String s=scanner.nextLine();
        System.out.println(removeString(s));

    }
}

这里需要注意,delect方法是左闭右开区间;
记住维护i;

薯队长最近在玩一个迷宫探索类游戏,迷宫是一个N*N的矩阵形状,其中会有一些障碍物禁止通过。这个迷宫还有一个特殊的设计,它的左右 边界以及上下边界是连通的,比如在(2,n)的位置继续往右走一格可以到(2,1), 在(1,2)的位置继续往上走一格可以到(n,2)。请问薯队长从起点位置S,最少走多少格才能到达迷宫的出口位置E。

链接:https://www.nowcoder.com/questionTerminal/c356fb7d1678419a9e9aa3c6f5a05765?answerType=1&f=discussion
来源:牛客网

输入描述:
第一行正整数N,接下来N行字符串
’.’表示可以通过
’#’表示障碍物
’S’表示起点(有且仅有一个)
’E’表示出口(有且仅有一个)
对于50%的数据N<10
对于100%的数据N<10^3

输出描述:
输出一个整数。表示从S到E最短路径的长度, 无法到达则输出 -1
示例1
输入
5
.#…
…#S.
.E###


输出
4

我很讨厌做迷宫相关的题,都是DFS BFS,我明天要恶补一下;
这个看了评论思路也不是很清晰;

在游戏中,击败魔物后,薯队长获得了N件宝物,接下来得把这些宝物卖给宝物回收员来赚点小钱。这个回收员有个坏毛病,每次卖给他一件宝 物后,之后他就看不上比这件宝物差的宝物了。在这个世界中,衡量宝物的好坏有两个维度,稀有度X和实用度H,回收员在回收一个宝物A 后,下一个宝物的稀有度和实用度都不能低于宝物A。那么薯队长如何制定售卖顺序,才能卖给回收员宝物总个数最多。

链接:https://www.nowcoder.com/questionTerminal/2f8a06421eea4dfe837453c8be6cb210?answerType=1&f=discussion
来源:牛客网

输入描述:
第一行一个正整数N。 接下来N行。每行两个整数分别表示X 和 H X1 H1 X2 H2 … XN HN
输入限制: 对于70%的数据:
0<N<10^4
0<Xi<10^6
0<Hi<10^6
100%的数据:
0<N<10^6
0<Xi<10^6
0<Hi<10^6

输出描述:
一个整数,表示最多可以卖出的宝物数
示例1
输入
4
3 2
1 1
1 3
1 2
输出
3

这道题看着题目长,其实比前边的简单,有种做数学的感觉,好好读题理解题意;
二维数组;按照第一列进行排序,如果第一列相同按照第二列排序;然后找出第二列的最长升序子序列;

这个找最长升序子序列的题在力扣中有,有两种解法:一种是动态规划,比较容易理解,dp数组中记录子序列的个数,然后如果下一个比它大,则更新,比它小则不变
https://leetcode-cn.com/problems/longest-increasing-subsequence/solution/dong-tai-gui-hua-she-ji-fang-fa-zhi-pai-you-xi-jia/

public static int lengthOfLIS(int[] nums) {
        int[] dp = new int[nums.length];
        // base case:dp 数组全都初始化为 1
        Arrays.fill(dp, 1);
        for (int i = 0; i < nums.length; i++) {
            for (int j = 0; j < i; j++) {
                if (nums[i] > nums[j])
                    dp[i] = Math.max(dp[i], dp[j] + 1);
            }
        }

        int res = 0;
        for (int i = 0; i < dp.length; i++) {
            res = Math.max(res, dp[i]);
        }
        return res;
    }

一种是二分查找算法;理解的不透彻;

public class numShow {
    public static int numShow(int n,int [][]show){
        Arrays.sort(show, (a,b)->a[0]!=b[0]?a[0]-b[0]:a[1]-b[1]);
        int []arr=new int[n];
        for(int i=0;i<n;i++){
            arr[i]=show[i][1];
        }
        int []dp=new int[n];
        int res=0;
        for(int num:arr){
            int l=0,r=res;
            while (l<r){
                int mid=(l+r)/2;
                if(dp[mid]<num){
                    l=mid+1;
                }else {
                    r=mid;
                }
            }

            if(l==res){
                res++;
            }
            dp[l]=num;
        }

        return res;

    }
    public static void main(String[] args) {
        Scanner scanner=new Scanner(System.in);
        int n=scanner.nextInt();
        int [][]arr=new int[n][2];
        for(int i=0;i<n;i++){
            for(int j=0;j<2;j++){
                arr[i][j]=scanner.nextInt();
            }
        }
       // int [][]arr={{3,2},{1,1},{1,3},{1,2}};
        System.out.println(numShow(n,arr));

    }
}
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
程序在VC++ 6下顺利编译通过。 一、 实验目的: (1) 熟练掌握链栈的基本操作及应用。 (2) 利用链表作为栈的存储结构,设计实现一个求解迷宫的非递归程序。 二、实验内容: 【问描述】 以一个m×n的长方阵表示迷宫,0和1分别表示迷宫中的通路和障碍。设计一个程序,对信任意设定的迷宫,求出一条从入口到出口的通路,或得出没有通路的结论。 【基本要求】 首先实现一个链表作存储结构的栈类型,然后编写一个求解迷宫的非递归程序。求得的通路以三元组(i,j,d)的形式输出,其中:(i,j)指示迷宫中的一个坐标,d表示走到下一坐标的方向。如:对于下列数据的迷宫,输出的一条通路为:(1,1,1),(1,2,2),(2,2,2),(3,2,3),(3,1,2),……。 【测试数据】 迷宫的测试数据如下:左上角(1,1)为入口,右下角(8,9)为出口。 1 2 3 4 5 6 7 8 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 0 0 1 1 0 1 0 1 1 1 0 0 1 0 0 0 0 1 0 0 0 0 0 1 0 0 0 1 0 1 0 1 1 1 1 0 0 1 1 1 0 0 0 1 0 1 1 1 0 0 0 0 0 0 以方阵形式输出迷宫及其通路。 输出: 请输入迷宫的长和宽:5 5 请输入迷宫内容: 0 1 1 0 0 0 0 1 1 0 1 0 0 1 1 1 0 0 1 0 1 1 0 0 0 迷宫的路径为 括号内的内容分别表示为(行坐标,列坐标,数字化方向,方向) (1,1,1,↓) (2,1,2,→) (2,2,1,↓) (3,2,1,↓) (4,2,2,→) (4,3,1,↓) (5,3,2,→) (5,4,2,→) (5,5,0,) 迷宫路径探索成功!

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值