48天笔试训练错题——day02

本文介绍了Java编程中的基础概念,包括类的静态方法、静态变量、抽象类和抽象方法、构造方法、接口以及编程练习实例,如排序子序列和倒置字符串的算法。
摘要由CSDN通过智能技术生成

目录

选择题

3.

6.

7.

8.

9.

10.

编程题

1. 排序子序列

2. 倒置字符串


选择题

3.

注意,这里的 hello 是静态方法(类方法),是与对象无关的。

静态方法不依靠对象也能调用,所以能正常运行。

6.

仔细观察,可以发现 static 变量定义在了成员方法中。

但是实际上 static 变量必须是成员变量(类变量,属于类的),不可以是局部变量

7.

abstract 只能修饰类和方法(抽象类和抽象方法),不能修饰字段。

写的抽象方法在抽象类中不能实现(不能加 {} ),而是得在继承抽象类的子类中实现。

8.

构造方法是可以省略的,不写构造方法的话,idea 会默认生成一个无参的构造方法(隐藏起来你看不到)。

构造方法也是方法,构造方法就和类名相同。

一个类可以有多个构造方法(方法重载)。

9.

抽象方法可以不用实现,抽象类里面可以有抽象方法。

 

10.

没啥好说的,接口中常量默认是 public static final 修饰的,方法默认是 public abstract。

编程题

1. 排序子序列

非递增:数组整体是递增的,但是相邻的数字可以相同,比如:1 2 2 3 4.

非递减:数组整体是递减的,但是相邻的数字可以相同,比如:4 3 3 2 1

题目要求的就是最少可以把数组分成多少个非递增和非递减。

模拟上面的过程,就可以分析出解题思路,此处还需要注意数组越界的问题:

根据上面的思路写代码即可。

代码实现:

import java.util.Scanner;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        while (in.hasNextInt()) { // 注意 while 处理多个 case
            int n = in.nextInt();
            // 多初始化一个是为了处理数组越界的问题
            int[] arr = new int[n + 1];
            for (int i = 0; i < n; i++) {
                arr[i] = in.nextInt();
            }
            int count = getCount(arr, n);
            System.out.println(count);
        }
    }

    public static int getCount(int[] arr, int n) {
        int count = 0;
        int i = 0;
        while (i < n) {
            if (arr[i] > arr[i + 1]) {
                while ( i < n && arr[i] > arr[i + 1]) {
                    i++;
                }
                count++;
                i++;
            } else if (arr[i] < arr[i + 1]) {
                while (i < n && arr[i] < arr[i + 1]) {
                    i++;
                }
                count++;
                i++;
            } else {
                i++;
            }
        }
        return count;
    }
}

2. 倒置字符串

思路:先逆序整个句子,再逆序每个单词

import java.util.Scanner;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        while (in.hasNextLine()) { // 注意 while 处理多个 case
            String str = in.nextLine();
            print(str);
        }
    }

    public static void print(String str) {
        // 逆序句子
        char[] arr = str.toCharArray();
        reverse(arr, 0, arr.length - 1);
        // 逆序每个单词
        int start = 0;
        int n = arr.length;
        while (start < n) {
            int end = start;
            while (end < n && arr[end] != ' ') {
                end++;
            }
            // 此时 end 一定是空格,或者越界了。
            reverse(arr, start, end - 1);
            // 跳过空格,从下一个单词开始
            start = end + 1;
        }
        System.out.println(new String(arr));
    }

    public static void reverse(char[] arr, int left, int right) {
        while (left < right) {
            char tmp = arr[left];
            arr[left] = arr[right];
            arr[right] = tmp;
            left++;
            right--;
        }
    }

}

  • 9
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值