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();
    }
}    
相关推荐
X_StarX1 分钟前
web程序设计期末复习-填空题
前端·学习·html·web·大学生·期末考
帅次10 分钟前
Flutter setState() 状态管理详细使用指南
android·flutter·ios·小程序·kotlin·android studio·iphone
倔强的石头_28 分钟前
【数据结构与算法 经典例题】使用队列实现栈(图文详解)
后端·算法
Camellia03111 小时前
嵌入式学习--江协stm32day7
stm32·嵌入式硬件·学习
黑色的山岗在沉睡1 小时前
P1216 [IOI 1994] 数字三角形 Number Triangles
算法·动态规划
爱上妖精的尾巴1 小时前
3-16单元格区域尺寸调整(发货单记录保存-方法2)学习笔记
javascript·笔记·学习·wps·js宏·jsa
千里马学框架1 小时前
安卓15开机启动Fallbackhome去除--成果展示
android·性能优化·手机·车载·aosp·fallbackhome
DQI-king1 小时前
ZYNQ学习记录FPGA(三)状态机
学习·fpga开发
Wgllss1 小时前
大型异步下载器:基于kotlin+Compose+协程+Flow+Channel实现多文件异步同时分片断点续传下载
android·架构·android jetpack
青山是哪个青山1 小时前
递归,回溯,DFS,Floodfill,记忆化搜索
算法·深度优先