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();
    }
}    
相关推荐
Hello server32 分钟前
利用 Python pyttsx3实现文字转语音(TTS)
python·学习·语音识别
小王努力学编程1 小时前
高并发内存池(二):项目的整体框架以及Thread_Cache的结构设计
开发语言·c++·学习·算法
EQ-雪梨蛋花汤1 小时前
【Part 2安卓原生360°VR播放器开发实战】第三节|实现VR视频播放与时间轴同步控制
android·交互·vr
虾球xz1 小时前
游戏引擎学习第266天:添加顶部时钟概览视图。
数据库·c++·学习·游戏引擎
陈奕昆1 小时前
4.3【LLaMA-Factory实战】教育大模型:个性化学习路径生成系统全解析
人工智能·python·学习·llama·大模型微调
补三补四1 小时前
遗传算法(GA)
人工智能·算法·机器学习·启发式算法
Lester_11011 小时前
嵌入式学习笔记 - 关于单片机的位数
笔记·单片机·学习
海尔辛1 小时前
学习黑客正经版Bash 脚本入门教程
chrome·学习·bash
拾贰_C2 小时前
【IDEA_Maven】(进阶版)永久性的更改IDEA中每个项目所依赖的Maven默认配置文件及其仓库路径
android·maven·intellij-idea
m0_578267862 小时前
从零开始的python学习(六)P86+P87+P88
python·学习