当前位置: 首页 > news >正文

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

一、字符串相加

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);
    }
}    

二、字符串相乘 

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();
    }
}    

http://www.dtcms.com/a/106721.html

相关文章:

  • 如何数据清洗
  • Python办公自动化(3)对Excel的操作
  • 安装docker和配置加速
  • (1)英特尔 RealSense T265(二)
  • 笔记:Vue3+Vite 怎么导入静态资源,比如图片/组件
  • 【算法学习】分治篇:分治算法的类型和解题详解
  • try语句总结
  • Docker Registry Clean
  • Scala的面向对象
  • 云巅之上:数字文明的重构与超越
  • C++进阶知识复习 16~30
  • bootloader+APP中,有些APP引脚无法正常使用?
  • 模拟医生会诊,四川大学华西医院团队开发多智能体对话框架助力疾病诊断
  • 【LINUX操作系统】通过System V看内核管理IPC资源
  • 经典算法 最大子段和
  • UE5学习笔记 FPS游戏制作37 蓝图函数库 自己定义公共方法
  • uni-app 框架 调用蓝牙,获取 iBeacon 定位信标的数据,实现室内定位场景
  • 求解传递闭包
  • 花洒洗澡完毕并关闭后过段时间会突然滴水的原因探究
  • 快速在 Windows 平台上高效安装flash_attn库
  • 【C++重点】std::map
  • STM32入门学习笔记(持续更新)
  • 如何使用Python通过STOMP协议接收ActiveMQ消息
  • The Rust Programming Language 学习 (九)
  • zkTLS 工作原理
  • 【C++初阶】--- string类
  • 23种设计模式-结构型模式-代理
  • jvm 的attach 和agent机制
  • 小白编程教程,编程设计中的三大程序控制结构,扣子平台的循环节点如何使用?扣子免费系列教程(26)
  • 质量和工艺之间的区别与联系?