• 网易笔试8.20


    第一题:删除数位求是否能整除
    题目大意:有a和b两个整数,每次操作都可以对a和b删除一位,比如a=‘1234’一次操作可以变为‘123’,‘124’,‘134’,‘123’,操作N次后,a可以被b整除或者b可以被a整除,求最少操作次数
    示例:a=1234 b=99,输出:2
    理由:a变为234,b变为9,操作2次

    思路:看了别人的代码才知道,要先把新的数用Set存起来,然后遍历判断(因为要判断最少操作数,所以要用Set存储)重点在于别人dfs,使用双重递归,要学会用。

    代码:

    1. import java.util.HashSet;
    2. import java.util.Scanner;
    3. import java.util.Set;
    4. public class Main_1 {
    5. public static void main(String[] args) {
    6. Scanner sc = new Scanner(System.in);
    7. int a = sc.nextInt(), b = sc.nextInt();
    8. Set set1 = new HashSet<>(), set2 = new HashSet<>();
    9. backtrack(set1, a + "", "", 0);
    10. backtrack(set2, b + "", "", 0);
    11. int alen = (a + "").length(), blen = (b + "").length();
    12. int res = Integer.MAX_VALUE;
    13. for (Integer si : set1) {
    14. for (Integer sj : set2) {
    15. System.out.println(si + " " + sj);
    16. if (si % sj == 0 || sj % si == 0) {
    17. res = Math.min(alen - (si + "").length() + blen - (sj + "").length(), res);
    18. }
    19. }
    20. }
    21. System.out.println(res == Integer.MAX_VALUE ? -1 : res);
    22. }
    23. static void backtrack (Set set, String s, String c, int i) {
    24. if (i == s.length()) {
    25. if (c.length() > 0){
    26. int val = Integer.parseInt(c);
    27. set.add(val);
    28. }
    29. return;
    30. }
    31. //好好体会一下这个递归的执行过程
    32. backtrack(set, s, c + s.charAt(i), i + 1);
    33. backtrack(set, s, c, i + 1);
    34. }
    35. }

    第二题:长城数组
    题目大意:数组可构成长城数组,比如[4,5,4,5,4,5]这样的是长城数组,每次操作可对原数组某一位元素进行+1操作,求最少操作次数
    示例:输入[1,1,4,5,1,4],输出:11

    思路:得到数组中奇数项的最大值,偶数项的最大值,遍历

    注意:都要使用 long类型存储数据

    代码:

    1. import java.util.Scanner;
    2. public class Main_2 {
    3. public static void main(String[] args) {
    4. Scanner sc = new Scanner(System.in);
    5. int n = sc.nextInt();
    6. long[] arr = new long[n];
    7. for (int i = 0; i < n; i++) {
    8. arr[i] = sc.nextInt();
    9. }
    10. long res = 0;
    11. long max1 = 0;
    12. long sum = 0;
    13. long cnt = 0;
    14. //偶数项的最大值
    15. for (int i = 0; i < n; i += 2) {
    16. max1 = Math.max(arr[i], max1);
    17. sum += arr[i];
    18. cnt++;
    19. }
    20. res += max1 * cnt - sum;
    21. long max2 = 0;
    22. sum = 0;
    23. cnt = 0;
    24. //奇数项的最大值
    25. for (int i = 1; i < n; i += 2) {
    26. max2 = Math.max(arr[i], max2);
    27. sum += arr[i];
    28. cnt++;
    29. }
    30. res += max2 * cnt - sum;
    31. if (max1 == max2) res += n / 2;
    32. System.out.println(res);
    33. }
    34. }

    第三题:好e
    题目大意: 一个字符串由r d e三种字符组成,好e的定义是e的两边分别是r和d,输入字符串,三种字符都可以修改求尽可能多地把e变好e,求最少操作次数
    示例:输入derrd,输出1,即把字符串变为dered

    思路:不会写,别人的代码(还不太懂)

    1. public class Main {
    2. public static void main(String[] args) {
    3. Scanner sc = new Scanner(System.in);
    4. String s = sc.next();
    5. if (s.length() < 3) {
    6. System.out.println(0);
    7. return;
    8. }
    9. String[] strs = new String[]{"red","der"};
    10. StringBuilder sb = new StringBuilder();
    11. int idx = 0;
    12. while(sb.length() < s.length() - 3) {
    13. sb.append(strs[idx % 2]);
    14. idx++;
    15. }
    16. int res = Integer.MAX_VALUE;
    17. int sum = 0;
    18. String str = sb.toString();
    19. for (int i = 0; i < str.length() - 3; i++) {
    20. if (str.charAt(i) != s.charAt(i)) sum++;
    21. }
    22. res = Math.min(sum, res);
    23. sb = new StringBuilder();
    24. idx = 1;
    25. while(sb.length() < str.length() - 3) {
    26. sb.append(strs[idx % 2]);
    27. idx++;
    28. }
    29. sum = 0;
    30. str = sb.toString();
    31. for (int i = 0; i < s.length() - 3; i++) {
    32. if (str.charAt(i) != s.charAt(i)) sum++;
    33. }
    34. res = Math.min(sum, res);
    35. System.out.println(res);
    36. String endStr = s.substring(s.length() - 3);
    37. if (endStr.charAt(0) == 'e' && endStr.charAt(1) != 'e' || endStr.equals("red") || endStr.equals("der")) {
    38. System.out.println(res);
    39. return;
    40. } else {
    41. System.out.println(res + 1);
    42. }
    43. }
    44. }

    第四题:V三元组
    题目大意:V三元组的定义为,有个三元组,第一个元素等于第三个元素,且第一个元素大于第二个元素,三个元素形成V结构,数学描述为[ax,ay,az],其中 ax = az且 ax > ay
    示例: 输入[3,1,3,4,3,4],输出3
    理由: 可构成三元组为[3,1,3] [3,1,3] [4,3,4], 题目为了更加清晰描述,给我们的是索引(从1开始),即为(1,2,3) (1,2,5) (4,5,6)

    自己写的代码超时了,有重复遍历的情况

    1. import java.util.Scanner;
    2. public class Test4 {
    3. public static void main(String[] args) {
    4. Scanner sc = new Scanner(System.in);
    5. int n = sc.nextInt();
    6. sc.nextLine();
    7. String[] input = sc.nextLine().split(" ");
    8. int[] A = new int[n];
    9. for(int i=0;i
    10. A[i] = Integer.parseInt(input[i]);
    11. }
    12. int res = 0;
    13. for(int i=0;i2;i++){
    14. int a_i = A[i];
    15. int k = i+2;
    16. for(k=i+2;k
    17. if(A[k] == a_i){
    18. for(int j=i+1;j
    19. if(A[j] < a_i){
    20. res++;
    21. }
    22. }
    23. }
    24. }
    25. }
    26. System.out.println(res);
    27. }
    28. }

    借鉴别人的代码,使用前缀和来减少遍历次数

    1. public static void main(String[] args) {
    2. Scanner sc = new Scanner(System.in);
    3. int n = sc.nextInt();
    4. int[] a = new int[n];
    5. for (int i = 0; i < n; i++) {
    6. a[i] = sc.nextInt();
    7. }
    8. long res = 0;
    9. for (int i = 0; i < n - 2; i++) {
    10. int sum = 0;
    11. for (int j = i + 1; j < n; j++) {
    12. if (a[j] < a[i]) sum++;
    13. else if(a[j] == a[i]) res += sum;
    14. }
    15. }
    16. System.out.println(res);
    17. }

  • 相关阅读:
    国产化系统加密/国产化系统防泄密
    白话模电:3.三极管(考研面试与笔试常考问题)
    LCR 122.路径加密
    46.集群节点维护—添加节点
    力扣226:反转二叉树
    低代码助力教培机构管理,数字化+智能化
    Maven 构建&项目测试
    1.3.3系统调用
    面试中的技术趋势:如何展示你跟进最新技术的能力
    牛客网AI面试第二弹
  • 原文地址:https://blog.csdn.net/qq_38235017/article/details/126445363