Java笔试模拟试题(二)

26 篇文章 1 订阅
18 篇文章 0 订阅

一,继承类笔试题,请回答下面代码的输出

public class Test extends A {
    B b = new B();
    Test(){
        System.out.println("test");
    }
    public static void main(String[] args) {
      new Test();
    }

}
class A{
    B y = new B();
    A(){
        System.out.println("A");
    }
}
class B{
    B(){
        System.out.println("B");
    }
}


原因:首先Test继承了A,所以下看A类,A类newB,所以先输出B,Bnew完后,输出A,进入Test中,先new了B,输出B,到构造器输出test。

二,(华为笔试题)给定一个n*2的二维数组,表示n个任务,一个信息表示是任务能够开始这的时间,另一个表示任务的结束期限,(开始时间一定小于结束时间,并且数值上一定都是正数),你作为单线程人,不能并行处理任务,但是每一个任务都需要一个单位时间来完成你需要将所有的任务时间,位于开始做时间与最后期限之间的返回结果。

图片解析:

 解法:

 代码实现:

import java.util.Arrays;
import java.util.PriorityQueue;

public class Test extends A {
    //开始时间
    public int time;
    public int end; //结束时间
    public boolean add ;  //判断时间的状态(ture添加到堆中)

    //封装一个对象
    public  Test(int t, int e ,boolean a){
        time = t;
        end = e;
        add = a;
    }

    public static boolean canDo(int[][] jobs){
        if(jobs == null || jobs.length < 2){
            return true;
        }
        int n = jobs.length;
        Test[] arr = new Test[n << 1];
        for (int i = 0; i < n ; i++) { //一个任务二个状态
            arr[i] = new Test(jobs[i][0],jobs[i][1],true);
            arr[i+n]= new Test(jobs[i][1],jobs[i][1],false);
        }
        Arrays.sort(arr,(a,b)->a.time-b.time); //排序
        PriorityQueue<Integer> heap = new PriorityQueue<>();  //创建堆

        for (int i = 0,lastTime = arr[0].time ; i < arr.length;i++) { //lastTime 上一个时刻,来计算时间差
            if (arr[i].add){
                heap.add(arr[i].end); //增加
            } else {  //检查时间
                int curTime = arr[i].time;
                for (int j = lastTime; j < curTime ; j++) {
                    if (heap.isEmpty()){
                        break;
                    }
                    heap.poll(); //抛出任务
                }
                if(heap.peek() <= curTime){  //堆顶时间<=当前时刻
                    return false;
                }
            }

        }
        return true
    }
}



三,二维数组查找整数

剑指 Offer 04. 二维数组中的查找

在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个高效的函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。

public boolean findNumberIn2DArray(int[][] matrix, int target) {
        if(matrix == null || matrix.length == 0 || matrix[0].length == 0 ){
            return false;
        }
        int lines = matrix.length-1;
        int columns = matrix[0].length-1;

        int line = 0;
        int column = columns;

        while (line <= lines && column >= 0 ) {
                if (target == matrix[line][column]){
                    return true;
                }else if (target > matrix[line][column]){
                    line++;
                }else if(target < matrix[line][column]){
                    column--;
                }
        } 
        return false;
    }

小编方法二:

public boolean findNumberIn2DArray(int[][] matrix, int target) {
        if(matrix == null || matrix.length == 0 || matrix[0].length == 0 ){
            return false;
        }
        int lines = matrix.length-1;
        int columns = matrix[0].length-1;

        int line = 0;
        int column = 0;

        while (line <= lines && column <= columns ) {
                if (target == matrix[line][column]){
                    return true;
                }else if ( target < matrix[line][column] || column == columns){
                    line++;
                    column = 0 ;
                }else if(target > matrix[line][column]){
                   column++;
                }
        } 
        return false;
    }

 四,替换空格

剑指 Offer 05. 替换空格

请实现一个函数,把字符串 s 中的每个空格替换成"%20"。

示例 1:

输入:s = "We are happy."
输出:"We%20are%20happy."
public String replaceSpace(String s) {
        int len = s.length();
        int count = 0;
        for(int i = 0 ; i < len ; i++ ){
            if(s.charAt(i) == ' '){
                count++;
            }
        }
        int newLen = len + count*2;
        char arr[] = new char[newLen];
        for(int i = len-1; i >= 0 ; i--){
            if(s.charAt(i) ==  ' '){
                arr[--newLen] = '0';
                arr[--newLen] = '2';
                arr[--newLen] = '%';
                len--;
            }else{
                arr[--newLen] = s.charAt(--len);
            }
            
        }
        return new String(arr);
    }


美团面试题

双色球,题目红色球和蓝色球的一个长度为n的排列,样例是rrbbr,其中r表示红色球,b表示蓝色球。以及小美现在口袋里还有a个红球,b个蓝球。现在往排列里插入球,使得相邻的球颜色不同,如果口袋里的球能满足,请输出插入球后的排列的最小长度,否则输出还需要多少个红球和蓝球。

给一个数组,是一些数字的排列,如果能够从中间某个位置分开,使得前面的数组严格递增,后面的严格递减,就称这个数组是好数组、完美数组什么的。现在给你一个数组1,2,1,2,1,问你这些数字最少加几能够成完美数组,示例的答案显然是2,把最中间的1变成3就行了。

 public static int middle_num(int[] arr){
        int middle = 0;
        int len  = arr.length -1;
        int val = 0;
        for (int i = 0; i < len; i++) {
            if (middle < arr[i]){
                middle = arr[i];
            }else{
                val = arr[i];
                middle = middle+arr[i];
                break;
            }
        }
        return middle - val;
    }

 

题目给了两个字符串,一个是标语acac,一个是核心思想ac,求标语有多少子序列包含核心思想的。题目说内容重复但是位置不同的算作不同的子序列,比如示例acac前面的ac和后面的ac是两个子序列。

小美买了一个三核CPU,一次只能完成三个任务,现在有一个任务时间组成的数组,求小美完成这些任务的最少时间。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

韶光不负

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值