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();
    }
}    
相关推荐
倔强的小石头_10 分钟前
【C语言指南】函数指针深度解析
java·c语言·算法
Yasin Chen16 分钟前
C# Dictionary源码分析
算法·unity·哈希算法
_Coin_-1 小时前
算法训练营DAY27 第八章 贪心算法 part01
算法·贪心算法
董董灿是个攻城狮6 小时前
5分钟搞懂什么是窗口注意力?
算法
Dann Hiroaki6 小时前
笔记分享: 哈尔滨工业大学CS31002编译原理——02. 语法分析
笔记·算法
花花鱼6 小时前
android studio 设置让开发更加的方便,比如可以查看变量的类型,参数的名称等等
android·ide·android studio
九年义务漏网鲨鱼6 小时前
【大模型学习 | MINIGPT-4原理】
人工智能·深度学习·学习·语言模型·多模态
jz_ddk6 小时前
[学习] C语言数学库函数背后的故事:`double erf(double x)`
c语言·开发语言·学习
alexhilton7 小时前
为什么你的App总是忘记所有事情
android·kotlin·android jetpack
qqxhb7 小时前
零基础数据结构与算法——第四章:基础算法-排序(上)
java·数据结构·算法·冒泡·插入·选择