笔试算法总结

文章目录

题目1

使用 StringBuilder 模拟栈的行为,通过判断相邻2个字符是否相同,如果相同就进行删除

java 复制代码
public class Main {
    public static String fun(String s) {
        if (s == null || s.length() <= 1) return s;

        StringBuilder builder = new StringBuilder(); // 使用StringBuilder模拟栈
        for (char c : s.toCharArray()) {
            if (builder.length() > 0 && builder.charAt(builder.length() - 1) == c) {
                builder.deleteCharAt(builder.length() - 1);
            } else {
                builder.append(c);
            }
        }

        return builder.toString();
    }

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String s = scanner.nextLine();
        System.out.println(fun(s));
    }
}

题目2

java 复制代码
public class Main {

    public static int climbStairs(int n) {
        if (n <= 2) {
            return n;
        }

        int[] dp = new int[n + 1]; // 动态规划数组

        dp[1] = 1;
        dp[2] = 2;

        for (int i = 3; i <= n; i++) {
            dp[i] = dp[i - 1] + dp[i - 2]; // 状态转移方程
        }

        return dp[n];
    }

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        System.out.println(climbStairs(n));
    }
}

题目3


java 复制代码
 public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int N = scanner.nextInt();
        int n = N;

        ArrayList<Integer> list = new ArrayList<>(N);
        while (n > 0) {
            list.add(scanner.nextInt());
            n -= 1;
        }

        ArrayList<Integer> list1 = new ArrayList<>(N);
        for (int i = 0; i < N; i++) {
            list1.add(0);
        }
        int res = 0;
        // 每次从每个口袋中取列表中最小值个糖果(0不管)
        while (!list1.equals(list)) {
            int min = Integer.MAX_VALUE;
            for (Integer i : list) {
                if (i == 0) continue;
                if (i < min) min = i;
            }

            for (int i = 0; i < list.size(); i++) {
                if (list.get(i) == 0) continue;
                list.set(i, list.get(i) - min);
            }

            res+=1;
        }
        System.out.println(res);
    }
}

题目4

输入示例:

txt 复制代码
5
1 -2 3 -4 5

输出示例:

txt 复制代码
15

思路很简单,但是当时做题提交的时候,通过率总是18%。不知道为啥,后面我改成了Long类型,然后就通过了全部用例。(易错1:第一次提交没考虑0的情况)

java 复制代码
// 这个是笔试通过的代码 当然优化之处很多
public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int N = scanner.nextInt();
        int n = N;
        ArrayList<Long> list = new ArrayList<>(N);
        while (n > 0) {
            list.add(scanner.nextLong());
            n -= 1;
        }

        if (list.size() == 1) {
            System.out.println(list.get(0));
            return;
        }
        int cnt = 0;// 统计负数个数(0也算入)
        int zero = 0;
        for (Long i : list) {
            if (i == 0) zero = 1;
            if (i <= 0) {
                cnt += 1;
            }
        }

        Long res = 0L;
        Long min = Long.MAX_VALUE;
        for (Long i : list) {
            res += Math.abs(i);
            if (min > Math.abs(i)) min = Math.abs(i);
        }

        if (zero != 0) {
            System.out.println(res);
            return;
        }

        if ((cnt & 1) == 1) {
            // 奇数个负数
            res = res - min - min;
        }

        System.out.println(res);
    }
}
相关推荐
2301_818419014 分钟前
C++中的协程编程
开发语言·c++·算法
add45a7 分钟前
C++中的工厂方法模式
开发语言·c++·算法
java1234_小锋7 分钟前
Java高频面试题:Spring-AOP通知和执行顺序?
java·开发语言·spring
番茄去哪了11 分钟前
Java基础面试题day02
java·开发语言·面向对象编程
無限進步D14 分钟前
二分算法 cpp
算法
xushichao198915 分钟前
C++中的工厂模式高级应用
开发语言·c++·算法
njsgcs15 分钟前
c# solidworks 折弯系数检查
开发语言·c#
SuperEugene19 分钟前
Vue3 + Element Plus 表格实战:批量操作、行内编辑、跨页选中逻辑统一|表单与表格规范篇
开发语言·前端·javascript
2501_9249526923 分钟前
C++模块化编程指南
开发语言·c++·算法
qzhqbb23 分钟前
差分隐私与大模型+差分隐私在相关领域应用的论文总结
人工智能·算法