关于OD笔试的3个题目

很感谢各位能够看本篇文章,先说一下自己的经历吧。

前前后后准备了一共15天的时间,我的学历是双非一本,学的是java,学完了cloud,但是现在的行情真的一言难尽,我也是很难找到一份心仪的工作,要么就是工资很低,要么就是频繁出差(类似在北京工作拿着西安的工资,因为我是西安人,找工作基本在西安,北上广基本都需要线下面试),面试了一些小公司,都是问最基础的问题,springboot都不怎么问,更别说cloud、mysql索引、优化等等的了。所以也是看透了很多公司,所以也一直想进大厂(也是大四才醒悟过来需要学习.....),虽说OD是外包,但是也是想进去学点东西,想走的更远,所以就开始准备了,庆幸我认识了一个算法大佬,他是某985毕业的佬,他是数学专业,转行做计算机的,从第一次问他算法题开始我就明白了985跟一本的差距真正在哪里(不是学校歧视,而是他的能力真的很强,他算法只学了很短的时间能解答我很多很多问题),同时hr一直在跟着我,我也很感激他,一直在跟着我,鼓励我,本来真的自己其实挺自暴自弃的,大四学了一年的java,结果找不到工作,心里多少是很不平衡的,但是说真的不想让这个hr失望,不想让问了很多问题的佬失望,不想让支持我的朋友失望,更不想让我自己失望。平时我都是打游戏到3点,平时打开电脑基本就是steam,wegame,那阵子9点就睡,开机就是浏览器-->力扣 有一天是3点起的床,就开始刷力扣,刷到6点头都是晕的,有几天真的是晕晕乎乎的,头都快炸了,没有人知道那两周是怎么过来的,庆幸这次也是凑合过了笔试,后面会好好准备面试,继续学习算法,感谢能够看到这里的朋友,祝你能够找一份心仪的工作。

100分值题:

题1:
输入一个字符串仅包含大小写字母和数字 输入的字符串最大不超过255个字符求字符串中包含的最长非严格递增连续数字序列的长度(比如34456属于非严格递增连续数字序列)


输入  abc2234019A334bc  

输出  4

思路:把这个字符串进行判断如果是数字就让长度是1,开始计算下面的,继续判断后来的字符,再用一层while判断下一个是否是数字,是数字的话,是否比前一个大,如果是长度+1,i自增,判断完了之后吧len的值给定义的maxLength,最后输出的是maxLength,如果len比max要小的话,i自增,说明目前为止出现的最大的长还没出现,如果后面都没有赋值成功的话,直接输出maxLength,这里直接让他是-1就可以,因为没有找到就返回的-1,少做了个判断。

代码:

public class Solution {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String str = in.nextLine();
        int maxLength = -1;
        int i  = 0;
        while (i < str.length()){
            if (isNum(str.charAt(i))){
                int len = 1;
                i++;
                while (i <str.length()&& isNum(str.charAt(i)) && str.charAt(i) >= str.charAt(i-1)){
                    len++;
                    i++;
                }
                if (len > maxLength)
                    maxLength = len;
            } else {
                i ++;
            }
        }
        System.out.println(maxLength);

    }

    public static boolean isNum(char c){
        return c >=48 && c <= 57;
    }
}

题2: 
给定一个序列,给定一个sum 求长度最长的连续子序列使得他们的和等于sum 最后返回长度,没有找到的话就返回-1 

输入  1,2,3,4,2  

          6

输出  3

思路:首先要根据“,”把字符串第一行给分割开放到一个int数组里面,然后就是对这个数组进行操作了。这里的想法是新建一个数组value记录所有和,然后在依次减去arr中的数字,最后对比给定的数字,返回最大长度

代码:

public class Solution {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String s1 = in.nextLine();
        int sum = in.nextInt();
        String[] s= s1.split(",");
        int len = s.length;
        int[] arr = new int[len];
        for (int i = 0; i < len; i++) {
            arr[i] = Integer.parseInt(s[i]);
        }
        int maxLength = 0;
        int[] value = new int[len];
        value [0] = arr[0];
        if (value[0] == sum)
            maxLength = 1;
        for (int i = 1; i < len; i++) {
            value[i] = value[i-1] + arr[i];
            if (value[i] == sum && maxLength < i+1)
                maxLength = i+1;
        }

        for (int j = 1; j < len; j++) {
            for (int i = j; i < len; i++) {
                value[i] = value[i] -arr[j-1];
                if (value[i] == sum && maxLength < i-j+1)
                    maxLength = i-j+1;
            }
        }
        System.out.println(maxLength);
    }
}


200分题

题目:不开心的小朋友


 public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        String n = in.nextLine();
        int anInt = Integer.parseInt(n);
        String next = in.nextLine();
 
        ArrayList<String> list = new ArrayList<>(anInt);
        int sum = 0;
        String[] split = next.split(" ");
        //可用队列实现
        ArrayList<String> qs = new ArrayList();
        
        for (int i = 0; i < split.length; i++) {
            //当前小朋友是否想离开摇摇车,摇摇车里面有就移除表示离开摇摇车
            if(list.contains(split[i])){
                list.remove(split[i]);
            }else {
                //判断是否还有空的摇摇车
                if(list.size() < anInt){
                    //有空闲摇摇车,坐上摇摇车
                    list.add(split[i]);
                }else {
          //没有摇摇车了,判断当前小朋友是否在排队队列中,如果在就移除,并把不开心的小朋友加一
                    if (qs.contains(split[i])){
                        qs.remove(split[i]);
                        sum += 1;
                        continue;
                    }else {
                        //没有在排队队列中,开始排队
                        qs.add(split[i]);
                    }
 
                }
            }
        }
        System.out.println(sum);
    }


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值