目录
选择题
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--;
}
}
}