Android学习总结之算法篇四(字符串)

一、字符串相加

java 复制代码
class Solution {
    /**
     * 该方法用于将两个以字符串形式表示的非负整数相加,并返回相加结果的字符串形式
     * @param num1 第一个以字符串形式表示的非负整数
     * @param num2 第二个以字符串形式表示的非负整数
     * @return 两个数相加结果的字符串形式
     */
    public String addStrings(String num1, String num2) {
        // 创建一个 StringBuilder 对象,用于存储相加的结果
        StringBuilder res = new StringBuilder("");
        // i 指向 num1 的最后一个字符,j 指向 num2 的最后一个字符
        int i = num1.length() - 1, j = num2.length() - 1;
        // carry 用于存储进位,初始化为 0
        int carry = 0;
        // 从两个字符串的末尾开始逐位相加,只要还有未处理的位就继续循环
        while(i >= 0 || j >= 0){
            // 如果 i 有效(即 i 不小于 0),将 num1 对应位置的字符转换为数字,否则为 0
            int n1 = i >= 0 ? num1.charAt(i) - '0' : 0;
            // 如果 j 有效(即 j 不小于 0),将 num2 对应位置的字符转换为数字,否则为 0
            int n2 = j >= 0 ? num2.charAt(j) - '0' : 0;
            // 计算当前位相加的结果,包括进位
            int tmp = n1 + n2 + carry;
            // 更新进位,carry 为 tmp 除以 10 的商
            carry = tmp / 10;
            // 将当前位相加结果的个位数添加到 res 中
            res.append(tmp % 10);
            // 移动到前一位
            i--;
            j--;
        }
        // 如果最后还有进位,将进位 1 添加到结果中
        if(carry == 1) res.append(1);
        // 由于结果是从低位到高位添加的,需要反转字符串得到正确的顺序
        return res.reverse().toString();
    }

    public static void main(String[] args) {
        Solution solution = new Solution();
        String num1 = "123";
        String num2 = "456";
        // 调用 addStrings 方法计算两个字符串表示的数字之和
        String result = solution.addStrings(num1, num2);
        System.out.println(result);
    }
}    

二、字符串相乘

java 复制代码
class Solution {
    /**
     * 此方法用于计算两个以字符串形式表示的非负整数的乘积,并将结果以字符串形式返回
     * @param num1 第一个非负整数的字符串表示
     * @param num2 第二个非负整数的字符串表示
     * @return 两个数乘积的字符串表示
     */
    public String multiply(String num1, String num2) {
        // 若其中一个数为 0,则直接返回 0
        if (num1.equals("0") || num2.equals("0")) {
            return "0";
        }
        // 获取 num1 的长度
        int m = num1.length();
        // 获取 num2 的长度
        int n = num2.length();
        // 两个数相乘结果的最大长度为 m + n,所以创建一个长度为 m + n 的数组来存储中间结果
        int[] result = new int[m + n];

        // 从 num1 的最后一位开始遍历
        for (int i = m - 1; i >= 0; i--) {
            // 从 num2 的最后一位开始遍历
            for (int j = n - 1; j >= 0; j--) {
                // 将当前位的字符转换为数字并相乘
                int mul = (num1.charAt(i) - '0') * (num2.charAt(j) - '0');
                // 计算乘积结果在 result 数组中的位置
                int p1 = i + j;
                int p2 = i + j + 1;
                // 加上之前可能存在的进位
                int sum = mul + result[p2];

                // 存储当前位的结果
                result[p2] = sum % 10;
                // 处理进位
                result[p1] += sum / 10;
            }
        }

        // 用于构建最终结果的字符串
        StringBuilder sb = new StringBuilder();
        // 遍历结果数组
        for (int num : result) {
            // 跳过前导零
            if (!(sb.length() == 0 && num == 0)) {
                sb.append(num);
            }
        }
        // 返回最终结果的字符串表示
        return sb.toString();
    }
}    
相关推荐
砖厂小工5 分钟前
用 GLM + OpenClaw 打造你的 AI PR Review Agent — 让龙虾帮你审代码
android·github
张拭心43 分钟前
春节后,有些公司明确要求 AI 经验了
android·前端·人工智能
张拭心1 小时前
Android 17 来了!新特性介绍与适配建议
android·前端
Kapaseker3 小时前
Compose 进阶—巧用 GraphicsLayer
android·kotlin
黄林晴4 小时前
Android17 为什么重写 MessageQueue
android
地平线开发者14 小时前
SparseDrive 模型导出与性能优化实战
算法·自动驾驶
董董灿是个攻城狮14 小时前
大模型连载2:初步认识 tokenizer 的过程
算法
地平线开发者15 小时前
地平线 VP 接口工程实践(一):hbVPRoiResize 接口功能、使用约束与典型问题总结
算法·自动驾驶
罗西的思考15 小时前
AI Agent框架探秘:拆解 OpenHands(10)--- Runtime
人工智能·算法·机器学习
HXhlx18 小时前
CART决策树基本原理
算法·机器学习