【笔试复盘】2021.8.11-华为机试

题目1:叠积木

给出一个列表如[[6,7,],[5,4],[3,2]],表示木块的长和宽,当木块的长和宽不大于另个木块的长和宽时,就可以放在上面,此外数组还可以左右翻转。当长宽都大于等于上一个积木时才可以搭到上一个积木上,此外数组还可以左右翻转。求最多能搭多少层。(与leetcode354:俄罗斯套娃相似,不过添加了翻转,增加了难度)。
输入:
[[5,4], [6,3], [6,7], [6,6], [4,6]]
输出:
4
解析:
  1. 积木数据处理,大的做长,小的做宽
  2. 所有积木从大到小排序
  3. 动态规划求最大:可以定义一个 dp 数组,dp[i] 表示如果积木为 i 时,最大积木嵌套数为多少。其状态的转移,即这个 dp[i] 的获得,需要从前面 dp[0] ~ dp[i - 1] 中找到宽大于当前积木,同时 dp 值是所找到的里面最大的dpMax,dp[i] = dpMax + 1
import java.util.Arrays;
import java.util.Comparator;
import java.util.Scanner;

public class Main1 {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String str = sc.nextLine();
        str = str.replaceAll("\\[", "");
        str = str.replaceAll("\\]", "");
        str = str.replaceAll("\\s+", "");
        String[] arrStr = str.split(",");
        int[][] arr=new int[arrStr.length/2][2];
        for(int i=0;i<arr.length;i++){
            int a=Integer.parseInt(arrStr[2*i]);
            int b=Integer.parseInt(arrStr[2*i+1]);
            arr[i][0]=Math.max(a,b);//大的是长度
            arr[i][1]=Math.min(a,b);//小的是宽度
        }
        int result=getResult(arr);
        System.out.println(result);
    }

    public static int getResult(int[][] arr){
        if(arr.length==0 || arr==null){
            return 0;
        }
        Arrays.sort(arr, new Comparator<int[]>() {
            public int compare(int[] o1, int[] o2) {
                if(o1[0]==o2[0]){
                    return o2[1]-o1[1];
                }
                else{
                    return o2[0]-o1[0];
                }
            }
        });
        int[] dp = new int[arr.length];
        Arrays.fill(dp, 1);
        int maxCount = 1;
        for (int i = 1; i < arr.length; i++) {
            for (int j = 0; j < i; j++) {
                if (arr[j][1] >= arr[i][1]) {
                    dp[i] = Math.max(dp[i], dp[j] + 1);
                }
            }
            maxCount = Math.max(maxCount, dp[i]);
        }
        return maxCount;
    }
}
//[[5,4],[6,3],[6,7],[6,6],[4,6]]  output:4
//[[5,4],[6,3],[6,7],[6,6]]  output:3

题目2:加密字符串

字符串中没有数字,全是小写字母,对该二进制文件进行压缩
  • 规则1:连续相同的字母,使用数字来表示重复出现的个数,bbbccc压缩成b3c3,但是如果只有两个连续的字母,压缩之后没有收益,不压缩,如bb就不再压缩:
  • 规则2:对于重复出现的连续子串,压缩为大写子串加重复数字,例如abcabcabc压缩成ABC3;
  • 规则3:重复字母和重复子串同时出现,优先进行重复子串的压缩,例如aaaabcabc,压缩成a3ABC2;
  • 规则4:有多个重复子串时,优先压缩最长的重复子串,例如aaaabcabcaaaabcabc,压缩成AAAABCABC2;
输入: "aaaabcaabcaabcaabc" 
输出: aaAABC4

题目3:往仓库放货物的最大数量

有一个天然形成的大坑,为台阶状结构,每个台阶的长度都为1,每个都的值为整数(正整数表示高于地平面,零表示与地平面平齐,负整数表示低于地平面)。有一批同等规格的货品(长度为N,高度为1),货品只能平故,且货物的上表面不能招过地平面(保度为零) ,或者说,高于地平面的地中也不可存故
货物。计算一个给定的大坑中影多可以放多少个货品?
输入:【第一行(物品的宽度),第二行(坑的宽度),第三行(坑的深度)】
2 
4 
0,-1,-2,0
输出:1

3
8
0,-1,-2,2,1,1,1,2
输出:0
import java.util.*;

public class newCode3 {

    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        int l=Integer.parseInt(sc.nextLine());
        int n=Integer.parseInt(sc.nextLine());
        String input=sc.nextLine();
        int[] arr=new int[n];
        for(int i=0;i<n;i++){
            arr[i]=Integer.parseInt(input.split(",")[i]);
        }
        int result=getResult(l,n,arr);
        System.out.println(result);
    }

    public static int getResult(int l,int n,int[] arr){
        int res = 0;
        //求每个深度对应的最大宽度就可以了
        //当宽度满足要求时,最大深度的相反数就为可以放的最多的物品 
        for(int i=0;i<arr.length;i++){
            int w=1;
            for(int k=i-1;k>=0;k--){
                if(arr[k]<=arr[i]){
                    w++;
                }
            }
            for(int k=i+1;k<arr.length;k++){
                if(arr[k]<=arr[i]){
                    w++;
                }
            }
            //和接雨水关键的不同就在于这一步,这个负深度就很巧妙,完美避开了正深度
            if(w>=l){
                res=Math.max(res,-arr[i]);
            }
        }
        return res;
    }
}






#华为机试##笔经##Java##华为#
全部评论
楼主给的第一个输入用例输出结果不对吧 就一个1*1的坑放不下2*1的货吧
点赞 回复 分享
发布于 2021-09-30 22:42
输入: "aaaabcaabcaabcaabc"  输出: aaAABC4 题目2,为啥不是aaAABCAABC2,呢
点赞 回复 分享
发布于 2021-11-12 14:16
第三问有点问题,在板宽2,地形为{0,-1,-2,-2,-2,-1, 0}的情况下应该可以部分重叠一共放三块板,但是给出的方法答案是2块。
点赞 回复 分享
发布于 2022-03-09 23:28
楼主咋没写第二题,是太简单了么😥
点赞 回复 分享
发布于 2022-04-05 13:25
楼主第二题有写代码嘛
点赞 回复 分享
发布于 2022-04-05 15:44
第三题只能通过部分
点赞 回复 分享
发布于 2022-04-06 20:17
作者大大 ,什么是大的做大,小的做小,这种描述看不懂呢
点赞 回复 分享
发布于 2022-10-24 21:30 广东

相关推荐

最近和朋友聊天,她说了句让我震惊的话:"我发现我连周末点外卖都开始'最优解'了,一定要赶在高峰期前下单,不然就觉得自己亏了。"这不就是典型的"班味入侵"吗?工作思维已经渗透到生活的方方面面。
小型域名服务器:啊?我一直都这样啊?我还以为是我爱贪小便宜呢?每次去实验室都得接一杯免费的开水回去,出门都得规划一下最短路径,在宿舍就吃南边的食堂,在实验室就吃北边的食堂,快递只有顺路的时候才取。
点赞 评论 收藏
分享
8 97 评论
分享
牛客网
牛客企业服务