唯一一次笔试全部AK的,百分之百,还有十分钟就直接交卷了,思路可能并不是最好的,但是都100%啦。
第1题:问n!得到的值中0的个数,比如7!为5040,输出为2
java
package 第一题;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
// 将所有数据记录在0-26的数组中,记录个数,这样就会将O(n^3)复杂度转化为O(26^3)
// 核心就是最终的值和字符串数组无关。 而字符串都是小写,长度26的数组就可以写出来了
// while (true){
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int result = 1;
// 计算总和
for(int i = 1; i <= n; i++){
result = result * i;
}
System.out.println(result);
// 计算0的个数
int count = 0;
while (result != 0){
if(result % 10 == 0)
count++;
result = result / 10;
}
System.out.println(count);
// }
}
}
第2题:相邻字符串可以进行变化,比如a可以变成b,a还可以变成z。问给一个字符串,最少执行多少次变化,可以使得字符串都是一样的。其中字符串都是小写字符。
java
package 第二题;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
// while (true){
// 将所有数据记录在0-26的数组中,记录个数
Scanner sc = new Scanner(System.in);
String s = sc.nextLine();
int count = 0;
int[] data = new int[26];
// 将所有的数据记录在列表中
for (int i = 0; i < s.length(); i++) {
data[s.charAt(i) - 'a']++;
}
System.out.println(doubleMinValue(data));
// }
}
public static long doubleMinValue(int[] data){
long result = Integer.MAX_VALUE;
for (int i = 0; i < 26; i++) {
if(data[i] == 0)
continue;
// 如果选择第i个作为中心,计算最小变化量
long count = 0;
// 开始进行计算
for (int j = 0; j < 26; j++) {
if(i == j || data[j] == 0)
continue;
if(i < j){
// 正向值
int left = j - i;
// 负向值
int right = 26 - j + i;
count = Math.min(left, right) * data[j] + count;
}else {
int left = j + 26 - i;
int right = i -j;
count = Math.min(left, right) * data[j] + count;
}
}
if(result > count)
result = count;
}
return result;
}
}
第3题:格式化输出问题
java
package 第三题;
import java.util.Scanner;
public class Main {
public static void draw(int count, String line) {
for (int i = 0; i < count; i++) {
System.out.print(line);
}
}
// 画出第一行 ...........
public static void draw1(int count) {
for (int i = 0; i < count; i++) {
draw(count, "...........");
System.out.println();
}
}
// 画出第二行 ..*******..
public static void draw2(int count) {
for (int i = 0; i < count; i++) {
// 画出左边
draw(count, "..");
// 画出中间
draw(count, "*******");
// 画出右边
draw(count, "..");
System.out.println();
}
}
// 画出第三行 ..*..*..*..
public static void draw3(int count) {
for (int i = 0; i < count; i++) {
draw(count, "..");
draw(count, "*");
draw(count, "..");
draw(count, "*");
draw(count, "..");
draw(count, "*");
draw(count, "..");
System.out.println();
}
}
// 画出第四行 ..*******..
public static void draw4(int count) {
draw2(count); // 与第2行一样
}
// 画出第5行 ..*..*..*..
public static void draw5(int count) {
draw3(count);
}
// 画出第6行
public static void draw6(int count) {
draw2(count);
}
// 画出第7行 .....*.....
public static void draw7(int count) {
for (int i = 0; i < count; i++) {
// 左
draw(count, ".....");
// 中
draw(count, "*");
// 右
draw(count, ".....");
System.out.println();
}
}
// 8
public static void draw8(int count) {
draw2(count);
}
// 9 .....*.....
public static void draw9(int count) {
draw7(count);
}
// 10 .*********.
public static void draw10(int count) {
for (int i = 0; i < count; i++) {
draw(count, ".");
draw(count, "*********");
draw(count, ".");
System.out.println();
}
}
// 11 .*********.
public static void draw11(int count) {
draw1(count);
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
// 思路:分行进行输出,每一行进行私有化定义
int at = sc.nextInt();
draw1(at);
draw2(at);
draw3(at);
draw4(at);
draw5(at);
draw6(at);
draw7(at);
draw8(at);
draw9(at);
draw10(at);
draw11(at);
}
}