笔试算法总结

文章目录

题目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);
    }
}
相关推荐
舒克日记1 分钟前
基于springboot针对老年人的景区订票系统
java·spring boot·后端
【杨(_> <_)】5 分钟前
SAR信号处理重要工具-傅里叶变换(二)
算法·信号处理·傅里叶分析·菲涅尔函数
怎么没有名字注册了啊10 分钟前
爬动的蠕虫
算法
取酒鱼食--【余九】10 分钟前
机器人学基础(一)【坐标系和位姿变换】
笔记·算法·机器人·开源·机器人运动学·机器人学基础
西西学代码12 分钟前
Flutter---showCupertinoDialog
java·前端·flutter
多多*15 分钟前
上传文件相关业务,采用策略模式+模版方法模式进行动态解耦
java·开发语言
晨非辰16 分钟前
【面试高频数据结构(四)】--《从单链到双链的进阶,读懂“双向奔赴”的算法之美与效率权衡》
java·数据结构·c++·人工智能·算法·机器学习·面试
im_AMBER16 分钟前
数据结构 03 栈和队列
数据结构·学习·算法
沐雨橙风ιε21 分钟前
Spring Boot整合Apache Shiro权限认证框架(实战篇)
java·spring boot·后端·apache shiro
左师佑图27 分钟前
Apache POI SXSSFWorkbook 报错“没有那个文件或目录”问题排查与解决方案
java·apache·excel