如何在Java中高效地实现数字的反转和字符串的拼接?

news2024/11/17 1:30:26

给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。

请你将两个数相加,并以相同形式返回一个表示和的链表。

你可以假设除了数字 0 之外,这两个数都不会以 0 开头。

在这里插入图片描述

输入:l1 = [2,4,3], l2 = [5,6,4]
输出:[7,0,8]
解释:342 + 465 = 807.
示例 2:

输入:l1 = [0], l2 = [0]
输出:[0]
示例 3:

输入:l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9]
输出:[8,9,9,9,0,0,0,1]

这是一个非常经典的链表问题,可以采用模拟加法的方式来解决。具体地讲,我们可以维护一个表示进位的变量carry,然后将两个链表上对应的节点相加并加上进位carry,最后得到的结果就是当前位置上的数字,如果超过了10,那么需要将进位carry设置为1,否则设为0。

具体操作步骤如下:

1.首先定义一个空节点dummy和一个指针p,表示结果链表的头节点和当前节点。
2.定义两个指针p1和p2分别指向两个链表的头节点,然后遍历它们,直到其中一个链表为空为止。
3.在循环中,首先计算当前位置上的数字,然后新建一个节点存储这个数字,并将其添加到结果链表末尾。同时更新进位carry的值。
4.如果一个链表已经遍历完了,那么我们需要将另一个链表剩余的部分以及进位carry依次加到结果链表中。
5.最后返回dummy的下一个节点即可。

代码实现如下:

package com.example.算法;

public class ListNode1 {

    public static void main(String[] args) {
        //创建两个链表l1和l2(此处省略创建过程)
        ListNode1 l1 = new ListNode1(2, new ListNode1(4, new ListNode1(3)));
        ListNode1 l2 = new ListNode1(5, new ListNode1(6, new ListNode1(4)));
        //调用addTwoNumbers函数计算结果
        ListNode1 result = addTwoNumbers(l1, l2);
        //遍历并输出新链表中的每个节点值
        while (result != null) {
            System.out.print(result.val + " ");
            result = result.next;
        }
    }

    int val;
    ListNode1 next;

    ListNode1() {
    }

    ListNode1(int val) {
        this.val = val;
    }

    ListNode1(int val, ListNode1 next) {
        this.val = val;
        this.next = next;
    }

    public static ListNode1 addTwoNumbers(ListNode1 l1, ListNode1 l2) {
        ListNode1 dummy = new ListNode1(0); // 这里需要用到哑结点技巧
        ListNode1 tail = dummy; // 定义一个尾指针,用于构建答案链表

        int carry = 0; // 进位信息,初始值为0

        while (l1 != null || l2 != null) {
            int x = (l1 != null) ? l1.val : 0;
            int y = (l2 != null) ? l2.val : 0;

            int sum = carry + x + y;
            carry = sum / 10; // 更新进位信息
            tail.next = new ListNode1(sum % 10); // 构造答案链表的下一个节点
            tail = tail.next; // 将尾指针向后移动一位

            if (l1 != null) {
                l1 = l1.next;
            }
            if (l2 != null) {
                l2 = l2.next;
            }
        }

        if (carry > 0) {
            tail.next = new ListNode1(carry); // 处理最高位的进位
        }

        return dummy.next; // 返回哑结点的下一个节点,即为所求的答案链表
    }
}

在这里插入图片描述

常用方法

package com.example.算法;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

import static java.util.Collections.replaceAll;

public class ListNode {


    public static void main(String[] args) {

        final int l1 = 9999999;
        final int l2 = 9999;
        int carry = 0;

        String a = new Demo().lee(l1, l2);
        System.out.println("------------------------------------");

        String a2 = new Demo().lee3(l1, l2);

        System.out.println("------------------------------------");
        Double aa = 1003.0;
        aa = aa / 10;
        System.out.println(aa);
        int abc = aa.intValue();
        System.out.println(abc);
    }


}


class Demo {


    public String lee(int l1, int l2) {

        int num = l1 + l2;
        // 反转后的数字
        int reverseNum = 0;
        // 反向遍历每一位数字
        while (num != 0) {
            int digit = num % 10; //10的余数可以理解为取最后个位数
            // System.out.println("现在的digit代表着个位数" + digit);
            reverseNum = reverseNum * 10 + digit; // 将个位数添加到反转数中
            num /= 10; // 去掉已处理的最后一位数
        }
        // 将反转后的数字转换成字符串形式
        String nums = Integer.toString(reverseNum);
        // 创建一个 StringBuffer 对象,用于拼接结果字符串
        StringBuffer sb = new StringBuffer();

        for (int i = 0; i < nums.length(); i++) {
            //append 拼接字符串 nums.charAt(i) 先拿到其中的每一位
            sb.append(nums.charAt(i));
            // 如果不是最后一位数字,则在数字之间添加一个逗号
            if (i != nums.length() - 1) {
                sb.append(",");
            }


        }
        // 将 StringBuffer 对象转换成字符串,并返回结果
        String fa = sb.toString();
        System.out.println("输出:1[" + fa + "]");

        return fa;
    }


    public String lee3(int l1, int l2) {
        int num = l1 + l2;
        List<Integer> digits = new ArrayList<>();

        // 取出每一位数字并添加到列表中
        while (num > 0) {
            //余数可以理解为取最后个位数 相当于把数据倒序了下取出来  num%10 取出来个位数 add 给了digits  下面再把已经add的数据删除了
            digits.add(num % 10);
            //再取消最后一位 把上面num % 10
            num /= 10;
        }

        // 将列表中的数字反转并拼接成字符串
        //首先使用stream()方法将整数列表转换为流,然后使用map()方法将每个整数转换为字符串形式。Object::toString
        // 表示将每个对象(包括整数)转换为它的字符串表示形式。最后,使用collect()方法与Collectors.joining()静态方法结合使用,
        // 使用逗号连接符将所有字符串组合在一起,并返回拼接后的字符串。
        String fa = digits.stream()
                .map(Object::toString)
                .collect(Collectors.joining(","));

        System.out.println("输出3:[" + fa + "]");
        return fa;
    }

}

在这里插入图片描述
这是一段Java代码,主要实现了将两个整数相加,并将其结果按照逆序的形式输出为字符串。代码中使用了两种不同的方法来实现,第一种方法中,通过取余和除法操作,反向遍历每一位数字,并将其添加到反转数中;第二种方法中,先将计算得到的数字存储在一个列表中,再将列表中的数字反转并拼接成字符串。最后,通过调用main()方法,可以得到程序的输出结果。

具体来说,代码中包含以下重要的部分:

两个整数相加
代码中定义了两个常量l1和l2,它们分别代表需要相加的两个整数。通过将它们相加,得到了num的值,即两数之和。

final int l1 = 9999999;
final int l2 = 9999;
int num = l1 + l2;

反向遍历每一位数字
为了将数字逆序输出,代码中使用了while循环语句,对num进行反向遍历。在每次循环中,通过对10取余的操作获取num的最后一位数字,并将其添加到reverseNum中。然后,通过除以10的操作,去掉已经处理过的最后一位数字。当num等于0时,说明所有的数字都已经处理完毕,循环结束。

while (num != 0) {
    int digit = num % 10;
    reverseNum = reverseNum * 10 + digit;
    num /= 10;
}

将数字转换成字符串并输出
代码中先将反转后的数字reverseNum转换成字符串形式nums,然后遍历其中的每一位数字,在数字之间添加一个逗号,并将结果添加到StringBuffer对象sb中。最后,将sb转换成字符串fa并返回。

String nums = Integer.toString(reverseNum);
StringBuffer sb = new StringBuffer();

for (int i = 0; i < nums.length(); i++) {
    sb.append(nums.charAt(i));
    if (i != nums.length() - 1) {
        sb.append(",");
    }
}

String fa = sb.toString();
System.out.println("输出:1[" + fa + "]");
return fa;

使用流操作将数字反转并拼接成字符串
代码中定义了另外一个方法lee3,它与前面的方法lee相比,使用了Java8中新增的流操作来实现。具体来说,代码中首先将计算得到的数字num中的每一位数字添加到一个列表digits中,然后通过stream()、map()和collect()等方法,将列表中的数字反转并拼接成字符串。最后,将拼接后的字符串fa返回。

List<Integer> digits = new ArrayList<>();

while (num > 0) {
    digits.add(num % 10);
    num /= 10;
}

String fa = digits.stream()
        .map(Object::toString)
        .collect(Collectors.joining(","));

System.out.println("输出3:[" + fa + "]");
return fa;

总的来说,这段代码使用了两种不同的方法来实现将两个整数相加,并将其结果按照逆序的形式输出为字符串。其中,通过取余和除法操作反向遍历每一位数字的方法更加直观易懂,而使用流操作来实现则更加简洁高效。不同的方法都有各自的优点和适用场景,根据具体情况进行选择即可。

在第一种方法中,代码通过while循环语句遍历整数的每一位数字,并将其添加到一个反转数中。然后,将反转后的数字转换成字符串并遍历其中的每一位数字,在数字之间添加逗号并输出为字符串。

在第二种方法中,代码首先将计算得到的数字中的每一位数字添加到一个列表中,然后使用流操作将列表中的数字反转并拼接成字符串。

总的来说,这段代码展示了Java中不同的处理方式来实现相同的目标,并且说明了它们的优点和适用场景。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/452187.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2023爱分析·工业互联网解决方案-设备后市场服务市场厂商评估报告

01 研究范围定义 “十四五”期间工信部等发布《“十四五”智能制造发展规划》&#xff0c;强调智能制造是我国制造强国主攻方向&#xff0c;加快推动智能制造发展&#xff0c;深化智能推广应用&#xff0c;开拓制造业数字化转型升级新路径&#xff0c;智能制造市场发展潜力进…

Pyqt应用相关之与Excel的联接

利用所学相关Pyqt实现对于Excel文件内部数据的处理&#xff0c;首先需要获取Excel的数据&#xff0c;在获取后进行保存处理即可完成相应的操作。 def save_data_btn_click(self):dir self.save_dir_text.text().strip()self.data_frame_group.to_excel(dir output.xlsx,sheet…

IMX6ULLPRO交叉编译第一个APP和第一个led驱动

目录 配置交叉编译工具链 永久生效 测试交叉编译工具链 第一个交叉编译程序 开发板运行 LED第一个驱动 开发板下操作 执行测试程序 配置交叉编译工具链 交叉编译工具链用来在 Ubuntu 主机上编译应用程序&#xff0c;而这些应用程序是在 ARM 等其他平台上运行…

GPT对SaaS领域有什么影响?

GPT火了&#xff0c;Chat GPT真的火了。 突然之间&#xff0c;所有人都在讨论AI&#xff0c;最初的访客是程序员、工程师、AI从业者&#xff0c;从早高峰写字楼电梯里讨论声&#xff0c;到村里大爷们的饭后谈资&#xff0c;路过的狗子都要和它讨论两句GPT的程度。 革命的前夜…

图像配准(匹配)与变化检测

文章目录 简介A Survey on Deep Learning-Based Change Detection from High-Resolution Remote Sensing Images 2022变化检测的基本框架基于神经网络的变化检测特征抽取变化检测的粒度场景级的变化检测&#xff08;SLCD&#xff09;目标级别的变化检测 Deep Learning-Based Ch…

全志v851s uart3 设置成普通串口收发

本文转载自&#xff1a;https://bbs.aw-ol.com/topic/3281/ 由于UART0 被设定为系统dubug 输出&#xff08;简单来说就是将ttyS0 设定为console&#xff09;&#xff0c;所以使用UART3 作为普通的串口&#xff0c;进行与别的设备通信。 1. 查看硬件电路图SCH_Schematic1_2022…

安全防御 --- APT、密码学

APT 深度包检测技术&#xff1a;将应用层内容展开进行分析&#xff0c;根据不同的设定从而做出不同的安全产品。 深度流检测技术&#xff1a;与APS画像类似。会记录正常流量行为&#xff0c;也会将某些应用的行为画像描述出来。也可将加密流量进行判断&#xff0c;并执行相应措…

揭秘移动云大会展区前沿科技

2023年4月25日-26日 我们苏州金鸡湖国际会议中心见&#xff01; 1场重磅主论坛、10场分论坛、2600㎡展区 数字中国新未来 尽在2023移动云大会 2023移动云大会设有中国移动和合作伙伴两大展区&#xff0c;联合40余家优质合作伙伴&#xff0c;全方位展示移动云在自主能力、行…

实验05:算法设计策略的比较与选择

1.实验目的&#xff1a; 比较同一问题&#xff0c;采用不同策略设计不同算法&#xff0c;分析和比较算法的性能。 2.实验内容&#xff1a; 自学第10章的10.1.1至10.1.3, 总结分析编程实现简单算法、分治法和动态规划算法的理论复杂度&#xff0c;编程实现这些算法。 3.实验…

C语言复习之顺序表(十五)

&#x1f4d6;作者介绍&#xff1a;22级树莓人&#xff08;计算机专业&#xff09;&#xff0c;热爱编程&#xff1c;目前在c阶段>——目标C、Windows&#xff0c;MySQL&#xff0c;Qt&#xff0c;数据结构与算法&#xff0c;Linux&#xff0c;多线程&#xff0c;会持续分享…

docker容器内的应用利用k8s configmap做配置中心

ConfigMap 能带来什么好处&#xff1f; 传统的应用服务都有自己的配置文件&#xff0c;各自配置文件存储在服务所在节点。如果配置出现变更&#xff0c;就需要对应节点的配置文件。Kubernetes 利用了 Volume 功能&#xff0c;完整设计了一套配置中心&#xff0c;其核心对象就是…

基于Java+Spring+vue+element实现旅游信息管理平台系统

基于JavaSpringvueelement实现旅游信息管理平台系统 博主介绍&#xff1a;5年java开发经验&#xff0c;专注Java开发、定制、远程、指导等,csdn特邀作者、专注于Java技术领域 作者主页 超级帅帅吴 Java项目精品实战案例《500套》 欢迎点赞 收藏 ⭐留言 文末获取源码联系方式 文…

基于模型预测(MPC)的四轮转向车辆轨迹规划(Matlab代码实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f468;‍&#x1f4bb;4 Matlab代码 &#x1f4a5;1 概述 在轨迹跟踪应用领域&#xff0c;通常 MPC 建模可根据机器人的控制方式选择基于运动学运动状态方程建模或者基于动力学运动状态…

深入探讨车载CAN协议的工作原理和应用场景

CAN概述 CAN&#xff08;Controller Area Network&#xff09;总线协议是一种数据通信协议&#xff0c;最初是由Bosch公司开发&#xff0c;用于汽车领域中的内部通讯。 CAN总线协议是一种串行通信协议&#xff0c;支持多主机和多从机之间的通讯&#xff0c;可以在不同的控制单…

典型的高可用设计(一):MinIO

为了更好的了解高可用设计&#xff0c;将各类常用服务关于高可用的设计原理汇总到一起&#xff0c;通过横向对比的方式去发现这些典型设计的共同之处和差异点。 一、部署方式 MinIO 有单机单硬盘、单机多硬盘、多机多硬盘三种部署模式。单机单硬盘存在单点风险&#xff0c;数据…

ElasticSearch 部署及安装ik分词器

ansiable playbook链接&#xff1a; https://download.csdn.net/download/weixin_43798031/87719490 需要注意的点&#xff1a;公司es集群现以三个角色部署分别为 Gateway、Master、Data 简单的理解可以理解为在每台机器上部署了三个es&#xff0c;以端口和配置文件来区分这三…

itop-3568 开发板系统编程学习笔记(18)LED 应用编程

【北京迅为】嵌入式学习之Linux系统编程篇 https://www.bilibili.com/video/BV1zV411e7Cy/ 个人学习笔记 文章目录 应用层操作 LED 的两种方式sysfs 方式控制 LED控制方法原理简介 编写 LED 应用程序 应用层操作 LED 的两种方式 应用层操作底层硬件有两种方法&#xff0c;分别…

数据治理与数据中台架构

随着工业 4.0 时代的到来&#xff0c;传统行业的数字化转型是大势所趋&#xff1b;将数据提高到数据要素层面&#xff0c;让传统的技术在新的场景下发挥出新的作用&#xff0c;是近期研究和探讨的焦点话题。数语科技支持和服务传统行业多年&#xff0c;聚焦于传统数据建模和数据…

PostgreSQL中的复制延迟

PostgreSQL是一个流行的开源关系数据库管理系统&#xff0c;PostgreSQL中可能遇到的一个常见问题是复制延迟。 在这篇博客中&#xff0c;我们将讨论什么是复制延迟&#xff0c;它为什么会发生&#xff0c;以及如何在PostgreSQL中减轻它。 什么是复制延迟&#xff1f; 复制延迟…