假期在刷牛客网上的真题,此题源自华为机试题库,文章目的在于记录学习心得,如有错误欢迎指正
原题如下:
描述:
写出一个程序,接受一个由字母、数字和空格组成的字符串,和一个字母,然后输出输入字符串中该字母的出现次数。不区分大小写,字符串长度小于500。
输入描述:
第一行输入一个由字母和数字以及空格组成的字符串,第二行输入一个字母。
输出描述:
输出输入字符串中含有该字符的个数。
示例1:
输入:ABCabc
a
输出:2
我的思路:
先将字符串中的大写字母转换为小写字母(我一开始的想法是将字符串转化为字符数组,遍历判断,再通过大小写字母ASCII码的差值32来进行相关修改),再遍历修改后的字符数组看是否与输入的字符相等。实现代码如下:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
String s1 = in.nextLine();
String s2 = in.nextLine();
char[] cs1 = s1.toCharArray();
char[] cs2 = s2.toCharArray();
for (char c : cs1) {
if (c >= 'A' && c <= 'Z') {
c += 32;
}
}
int n = 0;
for (char c : cs1) {
if (c == cs2[0] || c - 32 == cs2[0]) {
n++;
}
}
in.close();
System.out.println(n);
}
}
但是,当我提交上述代码后,有一个用例没有通过,debug之后我发现遍历的那一段的修改并不奏效,需要使用索引遍历,于是将代码修改成如下:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
String s1 = in.nextLine();
String s2 = in.nextLine();
char[] cs1 = s1.toCharArray();
char[] cs2 = s2.toCharArray();
for (int i = 0; i < cs1.length; i++) {
if (cs1[i] >= 'A' && cs1[i] <= 'Z') {
cs1[i] += 32;
}
}
int n = 0;
for (char c : cs1) {
if (c == cs2[0] || c - 32 == cs2[0]) {
n++;
}
}
in.close();
System.out.println(n);
}
}
至此,这段代码已经通过了所有用例,所以接下来我开始探索其他的解决方案
其他方案:减法
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
String s1 = in.nextLine().toLowerCase();
String s2 = in.nextLine().toLowerCase();
// 将s1中出现s2的部分用空字符串替换,这样相减后的差就是s2被替换的次数
// 由此可得s2在s1中出现的次数
System.out.println(s1.length() - s1.replaceAll(s2, "").length());
}
}
突然发现自己一开始没有用上String类的转换大小写方法,而是走了一条相对曲折的路线,同时我认为这个减法的思路也相当不错。
仔细一想又发现自己的思路还可以继续改进,比如不一定需要将字符串转换为字符数组再访问所有字符,而是可以直接使用String的charAt方法,修改后代码如下:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
String s = in.nextLine().toLowerCase();
char c = in.nextLine().toLowerCase().charAt(0);
in.close();
int n = 0;
for (int i = 0; i < s.length(); i++) {
if (s.charAt(i) == c) {
n++;
}
}
System.out.println(n);
}
}
关于这一题就先到这,如有错误,欢迎指正,谢谢啦!