宇信科技(2024-11-26 代码题结束十五分钟前全部AK)
唯一一次笔试全部AK的,百分之百,还有十五分钟就直接交卷了,思路可能并不是最好的,但是都100%啦。
第1题:问n!得到的值中0的个数,比如7!为5040,输出为2
package 第一题; import java.util.Scanner; public class Main { public static void main(String[] args) { // 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。问给一个字符串,最少执行多少次变化,可以使得字符串都是一样的。其中字符串都是小写字符。
package 第二题; import java.util.Scanner; public class Main { public static void main(String[] args) { // while (true){ // 将所有数据记录在0-26的数组中,记录个数 // 将所有数据记录在0-26的数组中,记录个数,这样就会将O(n^3)复杂度转化为O(26^3) // 核心就是最终的值和字符串数组无关。 而字符串都是小写,长度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题:格式化输出问题
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); } }