华为od机试题

第一题:给定一个队列,但是这个队列比较特殊,可以从头部添加数据,也可以从尾部添加数据,但是只能从头部删除数据。输入一个数字n,会依次添加数字1~n(也就是添加n次),但是是从头部添加还是从尾部添加未知,也会删除n次,要求也必须从按照1~n删除。因为可以从头部添加,也可以从尾部添加,所以顺序不对,题目说可以随时调整顺序,要求删除必须按照1~n删除,求最小的调整顺序次数。

输入:数字n,接下来的2n行是添加和删除语句。

题解:只有79.1%通过率,提示我超时,最后还是没写出100%

import java.util.*;

public class Solution1 {
    public static void main(String[] args){
        Scanner scanner = new Scanner(System.in);
        List<String>  list = new ArrayList<>();
        while(scanner.hasNextLine()){
            list.add(scanner.nextLine());
        }
        int n = Integer.parseInt(list.get(0));
        Deque<Integer> deque = new LinkedList<>();
        int start = 1;
        int count = 0;//这个是移动次数
        for(int j = 1;j<list.size();j++){
            String str = list.get(j);
            //如果是移除指令
            if(str.equals("remove")){
                if(!deque.isEmpty()){
                    if(deque.peekFirst()==start){
                        //如果队列不为空,且移除来的就是start那么可以移除
                        deque.removeFirst();
                        start++;
                    }else{
                        //此时就需要移动了
                        List<Integer> list1 = new ArrayList<>();
                        while(!deque.isEmpty()){
                            list1.add(deque.removeFirst());
                        }
                        Collections.sort(list1);
                        for(int temp = 0;temp<list1.size();temp++){
                            deque.addLast(list1.get(temp));
                        }
                        deque.removeFirst();
                        count++;
                    }
                }
                continue;
            }
            String[] strs = str.split(" ");
            //如果是添加指令
            if( strs[1].equals("add")){
                if(strs[0].equals("head")){
                    //从头部添加
                    deque.addFirst(Integer.parseInt(strs[2]));
                }else{
                    //从尾部添加
                    deque.addLast(Integer.parseInt(strs[2]));
                }
            }
        }
        System.out.println(count);
    }
}

第二题:

0、1、2代表汽车颜色,汽车每秒只能出现1次,形如[1,2,2,0],给定一个时间,求这个时间内,汽车颜色出现最多的汽车数量。

难倒是不难,但是最后也只有90%通过率。

import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String str = scanner.nextLine();
        int win = scanner.nextInt();
        String[] strs = str.split(" ");
        int[] nums = new int[strs.length];
        for(int i=0;i<strs.length;i++){
            nums[i] = Integer.parseInt(strs[i]);
        }
        int max = Integer.MIN_VALUE;

        for(int i=0;i<=nums.length-win;i++){
            Map<Integer,Integer> map = new HashMap<>();
            for(int j=i;j<i+win;j++){
                if(map.containsKey(nums[j])){
                    map.put(nums[j],map.get(nums[j])+1);
                }else{
                    map.put(nums[j],1);
                }
            }
            for(int k : map.values()){
                max = Math.max(max,k);
            }
        }
        System.out.println(max);
    }
}

第三题:数字1、2、3、4、5、6、7、8、9分别关联不同的字母,例如7关联"u","v",8关联"x","w",输入一个字符串例如“78”,

和一个屏蔽字符串“ux”,那么“78”可以组成多个字符串例如:“ux”,“uw”,“vx”,“vw”,过滤这些完全包含屏蔽字符串的每一个字符的字符串,然后输出剩下的字符串。100%通过率。

import java.util.*;

public class Solution2 {
    public static Map<Character, List<String>> map = new HashMap<>();
    static {
        map.put('0',new ArrayList<String>(){{add("a");add("b");add("c");}});
        map.put('1',new ArrayList<String>(){{add("d");add("e");add("f");}});
        map.put('2',new ArrayList<String>(){{add("g");
            add("h");
            add("i");}});
        map.put('3',new ArrayList<String>(){{add("j");
            add("k");
            add("l");}});
        map.put('4',new ArrayList<String>(){{add("m");
            add("n");
            add("o");}});
        map.put('5',new ArrayList<String>(){{add("p");
            add("q");
            add("r");}});
        map.put('6',new ArrayList<String>(){{add("s");
            add("t");}});
        map.put('7',new ArrayList<String>(){{add("u");
            add("v");}});
        map.put('8',new ArrayList<String>(){{add("w");
            add("x");}});
        map.put('9',new ArrayList<String>(){{add("y");
            add("z");}});
    }


    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String str1 = scanner.nextLine();
        String str2 = scanner.nextLine();
        char[] chars = str1.toCharArray();
        List<String> result = new ArrayList<>();
        StringBuilder sb = new StringBuilder();
        recur(result,chars,sb,0);
        List<String> result1 = new ArrayList<>();
        for(String s : result){
            if(!contaisPinBi(s,str2)){
                result1.add(s);
            }
        }
        for(String s : result1){
            System.out.print(s+",");
        }
//        System.out.println(contaisPinBi("ux","ux"));
    }

    private static boolean contaisPinBi(String s, String str2) {
        char[] chars = str2.toCharArray();
        int count = 0;
        for(char ch : chars){
            if(s.contains(String.valueOf(ch)))count++;
        }
        return count==str2.length();
    }

    private static void recur(List<String> result, char[] chars, StringBuilder sb,int floor) {
        if(floor == chars.length){
            result.add(sb.toString());
            return;
        }
        List<String> strings = map.get(chars[floor]);
        for (String string : strings) {
            sb.append(string);
            recur(result,chars,sb,floor+1);
            sb.deleteCharAt(floor);
        }
    }
}

不知道会不会有面试机会,也不知道面试难不难,找工作真的好难呀,哭了。

#华为机试,emo了##华为od机试##华为od面经##华为od捞人#
全部评论
第一题我没看明白,第二题第三题太简单了吧,我应该能写出来,不知道后面的用例会不会超时
1 回复 分享
发布于 2022-11-07 21:25 浙江
投的哪个部门,哪个地域呀?看通过率应该是通过机试了,有没有兴趣来终端呀,武汉和东莞定于都招人。
点赞 回复 分享
发布于 2022-11-07 19:34 广东
你第一题跟我一样 我python写的 比较简单 但一样超时了 优化好久都没全a
点赞 回复 分享
发布于 2022-11-24 23:48 四川
看样子数据范围比较水,第一题可以把那个deque改成 一个数组,下标从100000开始自己记录左右下标, 别用那个list1重新赋值,直接在原deque数组操作排序,不过还是n^2logn, 他都说了数据范围1-n, sort改下桶排就n^2了,应该能过你这个题了,这个题范围应该是10000 简单想一下其实你根本就不需要做这个排序,你只需要这段区间你排过序了就行, 用一个标记数组记录这个区间里的数,左边没有来数并且需要的数在你的标记数组里就直接取, 左边来数了正好等于你要的数直接取,否则+1,把额外新来的数放到你标记数组里On就可以了。 第二题不是那个滑动窗口原题吗,存个set左边拿出来右边放进去,或者直接写On的写法就行。
点赞 回复 分享
发布于 2023-01-18 10:48 北京

相关推荐

11-15 21:21
已编辑
重庆邮电大学 测试工程师
第一个offer竟然是康子给的!要不要先签了保底,纠结😣
offer五面十方来:恭喜恭喜,这是我最想去的base和岗了
点赞 评论 收藏
分享
点赞 评论 收藏
分享
10-28 15:45
门头沟学院 C++
西南山:海康威视之前不是大规模裁员吗
点赞 评论 收藏
分享
5 9 评论
分享
牛客网
牛客企业服务