Day02:笔试题总结

目录

一,选择题

二,编程题

1.排序子序列

2.倒置字符串


一,选择题

1.

解析:

父类new子类对象都可以

2.

扫描二维码关注公众号,回复: 14712728 查看本文章

解析:

可以从String方法toLowerCase的源码看

这个方法的返回值代表,如果常量池中有就会返回常量池中的

这个方法的返回值代表,如果常量池中没有的话,就会new一个新的字符串放进去

 因此,从这道题来看,在原本的字符串常量池中有“admin”,但是没有"Admin",在进行转换时,就会执行new一个新的admin出来,所以,两个字符串的内容相同,但是地址不同

3.

解析:

因为hello方法是静态成员方法即类成员方法,但是这个new对象的时候是空引用,但是也是一个对象,可以调用类成员方法,实际开发中不能这么写 

4.

解析:

A.super()和this()都必须在第一行 

C.this()和super()不能同时出现在同一个构造器中,因此都要在第一行

D.在static环境中,this不可使用,因为this是指向当前对象的引用,但是static方法又不依赖于对象

5.

解析:

因为子类没有无参的构造方法,因此子类创建对象时会使用父类的构造方法 

6.

解析:

在静态成员方法和普通方法中都不能出现静态成员变量,静态成员变量属于类,不属于任何一个方法 

7.

解析:

A.abstract可以修饰方法和类,但是不能修饰字段(成员变量)

B.抽象方法不能有方法体,即不能有大括号 

C.声明抽象方法一定不能有大括号

8.

解析:

A.构造方法不能省略

B.构造方法必须与类名同名,但是构造方法本来就是方法啊

C.构造器是在new一个对象时,一定会执行的

D.一个类,可以定义多个构造方法,构造方法可以重载

9.

解析:

A.可以实现

B.对成员变量进行运算必须是在方法内部

C.没有abstract,就算有也是错的,因为没有构成重载,与method方法同名了

D.抽象方法不能有方法体(花括号) 

10.

解析:

接口是要被实现的,提供给外部使用,一定不能是私有的,而且,接口的修饰限定符默认是public 

二,编程题

1.排序子序列

题目内容:

解析:

1)首先就是数组问题,再细分一下就是拆分数组的问题

2)其次,题目要求就是想知道这个数组里面有多少个单调递增或者单调递减的子数组

3)根据传统的判断某一个数组的是递增还是递减的时候,应该是,定义一个纯大于或者小于的条件,但是对于这道题来说,纯判断是不行的,因为,这个数组是这些个小数组的组合,必须进行复合判断

4)也因此解题思路就明显了,如何进行一个复合判断,按照以前的一次循环判断是否可以?答案是不行,那两次呢?这就需要再次分析,和双层循环最像的就是广度优先搜索了,借鉴一下,我们可以外层循环遍历整个数组,内层循环加上限制条件,也知道这个数组是多个单调增或减的子数组组合而成的,所以,可以给三个循环条件,大于等于和小于的情况,借用循环的i来控制数组的循环进程

5)具体解析看解题代码和注释

解题代码:

import java.util.*;

public class Main{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        /*
        1.首先定义一个数组,长度为n+1,用来接收题目的数据
        2.为什么是“n + 1”
        3.在下面的多重循环中,肯定会有数组越界的情况出现,因为,i总是要和i+1处的元素进行
          比较,所以,防止数组越界的情况出现
        4.再根据题目中说的,数组元素最小为1且不可能是负数(这不是最关键的)
        5.最主要是,不论最后一个元素是负数还是正数,都不会访问到,因为我们的外层
          循环条件只判断到i = n - 1;
        */
        int[] array = new int[n + 1];
        for(int i = 0;i < n;i++){
            array[i] = sc.nextInt();
        }
        //定义外层循环的i变量和子数组计数器
        int i = 0;
        int count = 0;
        //外层循环,控制还在数组内访问,不会越界访问
        while(i < n){
            //第一种情况:如果是增,就一直增,直到不增,count++让i++,访问下一个元素的下标
            if(array[i] < array[i + 1]){
                //一直访问同类增加的情况
                while(i < n && array[i] < array[i + 1]){
                    i++;
                }
                //如果i+1处元素小于i处的元素,那么count++
                count++;
                i++;
                //对于相等的元素,可以归为一类,不影响增加或者减少的情况
            }else if(array[i] == array[i + 1]){
                i++;
            }else{
                //减小的情况同增加一样
                while(i < n && array[i] > array[i + 1]){
                    i++;
                }
                count++;
                i++;
            }
        }
        System.out.println(count);
    }
}

2.倒置字符串

题目内容:

解析:

1)这是一道简单的字符串题目,使用String自带的api来进行分割,并以字符串数组的形式接收

2)(方法一)定义左右端点,进行元素交换

3)(方法二)定义一个StringBuilder对象sb,逆序循环,sb进行拼接

解题代码:

方法一:

import java.util.*;

public class Main{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        String s = sc.nextLine();
        String[] str = s.trim().split(" ");
        int left = 0;
        int right = str.length - 1;
        while(left < right){
            String temp = str[left];
            str[left] = str[right];
            str[right] = temp;
            left++;
            right--;
        }
        String s2 = "";
        for(int i = 0;i < str.length;i++){
            s2 = s2 + str[i];
            s2 = s2 + " ";
        }
        System.out.println(s2.trim());
    }
}

方法二:

import java.util.*;

public class Main{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        String s = sc.nextLine();
        String[] str = s.trim().split(" ");
        StringBuilder sb = new StringBuilder();
        for(int i = str.length - 1;i >= 0;i--){
            sb.append(str[i]);
            sb.append(" ");
        }
        System.out.println(sb.toString().trim());
    }
}

猜你喜欢

转载自blog.csdn.net/qq_54773998/article/details/123141062
今日推荐