笔试狂刷--Day2(模拟高精度算法)

news2024/11/18 8:50:09

大家好,我是LvZi,今天带来笔试狂刷--Day2(模拟高精度算法)
在这里插入图片描述

一.二进制求和

题目链接:二进制求和
分析:
在这里插入图片描述

代码实现:

class Solution {
    public String addBinary(String a, String b) {
        int c1 = a.length() - 1, c2 = b.length() - 1, t = 0;
        StringBuffer ret = new StringBuffer();

        while(c1 >=0 || c2 >= 0 || t != 0) {
            if(c1 >= 0) t += a.charAt(c1--) - '0';// 保证不为空
            if(c2 >= 0) t += b.charAt(c2--) - '0';// 保证不为空

            char ch = (char)((t % 2) + '0');
            ret.append(ch);
            t /= 2;// 存储进位
        }

        
        return ret.reverse().toString();
    }
}

二.大数相加(十进制求和)

大数相加(十进制求和)

代码实现:
1.模拟

import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 计算两个数之和
     * @param s string字符串 表示第一个整数
     * @param t string字符串 表示第二个整数
     * @return string字符串
     */
    public String solve (String a, String b) {
        // write code here
        int c1 = a.length() - 1, c2 = b.length() - 1, t = 0;
        StringBuffer ret = new StringBuffer();

        while(c1 >=0 || c2 >= 0 || t != 0) {
            if(c1 >= 0) t += a.charAt(c1--) - '0';// 保证不为空
            if(c2 >= 0) t += b.charAt(c2--) - '0';// 保证不为空

            char ch = (char)((t % 10) + '0');
            ret.append(ch);
            t /= 10;// 存储进位
        }

        
        return ret.reverse().toString();
    }
}

2.使用Java内置的BigInteger

import java.util.*;
import java.math.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 计算两个数之和
     * @param s string字符串 表示第一个整数
     * @param t string字符串 表示第二个整数
     * @return string字符串
     */
    public String solve (String s, String t) {
        // write code here
        BigInteger a = new BigInteger(s);
        BigInteger b = new BigInteger(t);
        BigInteger ret = a.add(b);

        return ret.toString();
    }
}

三.大数乘法

大数乘法
分析:
在这里插入图片描述

代码实现:
1.

import java.util.*;
import java.math.*;

public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param s string字符串 第一个整数
     * @param t string字符串 第二个整数
     * @return string字符串
     */
    public String solve (String ss, String tt) {
        // write code here
        char[] s = new StringBuffer(ss).reverse().toString().toCharArray();
        char[] t = new StringBuffer(tt).reverse().toString().toCharArray();
        int n = s.length, m = t.length;
        int[] tmp = new int[m + n];

        for(int i = 0; i < n; i++)
            for(int j = 0; j < m; j++) 
                tmp[i + j] += (s[i] - '0') * (t[j] - '0');

        // 模拟加法
        int c = 0;
        StringBuffer ret = new StringBuffer();
        for(int x : tmp) {
            c += x;
            ret.append((char)(c % 10 + '0'));
            c /= 10;
        }

        // 处理前导零
        while(ret.length() > 1 && ret.charAt(ret.length() - 1) == '0') {
            ret.deleteCharAt(ret.length() - 1);
        }

        return ret.reverse().toString();
    }
}

2.使用BigInteger

import java.util.*;
import java.math.*;

public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param s string字符串 第一个整数
     * @param t string字符串 第二个整数
     * @return string字符串
     */
    public String solve (String s, String t) {
        // write code here
        BigInteger a = new BigInteger(s);
        BigInteger b = new BigInteger(t);
        BigInteger ret = a.multiply(b);

        return ret.toString();
    }
}

四.两数相加I(链表)

题目链接:两数相加I
代码实现:

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {

        ListNode cur1 = l1;
        ListNode cur2 = l2;
        ListNode phead = new ListNode(0);
        ListNode cur = phead;// 用于尾插

        int t = 0;// 用于表示本次相加的结果  处理进位

        // 要注意t最后可能不为0 要进一位
        while(cur1 != null || cur2 != null || t != 0) {
            // 加上第一个节点
            if(cur1 != null) {
                t += cur1.val;
                cur1 = cur1.next;
            }

            // 加上第二个节点
            if(cur2 != null) {
                t += cur2.val;
                cur2 = cur2.next;
            }

            ListNode newNode = new ListNode(t % 10);
            t /= 10;

            // 尾插
            cur.next = newNode;
            cur = newNode;
        }
        return phead.next;
    }
}

五.两数相加II(链表逆序)

题目链接:两数相加II(链表逆序)
代码实现:

import java.util.*;

/*
 * public class ListNode {
 *   int val;
 *   ListNode next = null;
 *   public ListNode(int val) {
 *     this.val = val;
 *   }
 * }
 */

public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param head1 ListNode类
     * @param head2 ListNode类
     * @return ListNode类
     */
    public ListNode addInList (ListNode head11, ListNode head22) {
        // write code here
        ListNode h1 = reverse(head11), h2 = reverse(head22), ret = new ListNode(0), phead = ret;
        ListNode c1 = h1, c2 = h2;
        int t = 0;

        while (c1 != null || c2 != null || t != 0) {
            if (c1 != null) {
                t += c1.val;
                c1 = c1.next;
            }
            if (c2 != null) {
                t += c2.val;
                c2 = c2.next;
            }

            ListNode tmp = new ListNode(t % 10);
            t /= 10;
            
            phead.next = tmp;
            phead = phead.next;
        }

        // 逆序最后的结果
        return reverse(ret.next);
    }

    // 逆序链表
    private ListNode reverse(ListNode head) {
        ListNode phead = new ListNode(0), cur = head;

        while (cur != null) {
            ListNode curNext = cur.next;

            cur.next = phead.next;
            phead.next = cur;

            cur = curNext;
        }
        return phead.next;
    }
}

总结:

  1. 高精度算法本质上就是模拟竖式运算,高精度加法通过变量t和进制来确定每次相加的结果和保存响应的进位;高精度乘法实际上是模拟了无进位相乘再相加的过程,使用数组保存当前位置结果的总和,最后再对整个数组模拟十进制相加即可(注意可能的前导0)
  2. 注意模拟过程中的顺序,需要从最低位开始模拟,以及注意最后的返回结果(有的需要逆序)
  3. 在Java中,如果涉及到高进度的加减法,可以使用自带的BigInteger

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

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

相关文章

【Node.js】01 —— fs模块全解析

&#x1f525;【Node.js】 fs模块全解析 &#x1f4e2; 引言 在Node.js开发中&#xff0c;fs模块犹如一把万能钥匙&#xff0c;解锁着整个文件系统的操作。从读取文件、写入文件、检查状态到目录管理&#xff0c;无所不能。接下来&#xff0c;我们将逐一揭开fs模块中最常用的那…

一二三应用开发平台使用手册——系统管理-用户组-使用说明

概述 在RBAC模型中&#xff0c;资源、角色、用户三个关键元素&#xff0c;构成权限体系。在平台设计和实现的时候&#xff0c;以下几个核心问题思考如下&#xff1a; 角色&#xff0c;单层平铺还是树形结构&#xff1f; 在小型应用中&#xff0c;角色数量有限的情况下&#x…

JavaScript变量及数据类型

目录 概述&#xff1a; 变量&#xff1a; 前言&#xff1a; 变量的命名&#xff1a; 定义变量&#xff1a; 为变量赋值&#xff1a; 变量提升&#xff1a; let和const关键字&#xff1a; JS数据类型&#xff1a; 前言&#xff1a; typeof操作符&#xff1a; JS基本…

vite(vue3)配置内网ip访问的方法步骤

如果没有进行配置&#xff0c;运行项目之后&#xff0c;看到的访问地址是本地访问地址&#xff0c;其他人访问不了。 如下&#xff1a; 一、配置 “ vite.config.ts ” 文件 server: {host: 0.0.0.0 }, 如图所示&#xff1a; 添加 server 配置后保存 “ vite.config.ts ” 文…

adb工具使用

作者简介&#xff1a; 一个平凡而乐于分享的小比特&#xff0c;中南民族大学通信工程专业研究生在读&#xff0c;研究方向无线联邦学习 擅长领域&#xff1a;驱动开发&#xff0c;嵌入式软件开发&#xff0c;BSP开发 作者主页&#xff1a;一个平凡而乐于分享的小比特的个人主页…

银河麒麟安装OpenJDK

# 更新软件包列表&#xff08;根据系统的实际情况&#xff0c;可能不需要这一步&#xff09; sudo apt-get update # 安装OpenJDK sudo apt-get install openjdk-8-jdk

【JAVA面试题】探索多线程同步:ReentrantLock与synchronized的对比解析

程序员如何搞副业&#xff1f; 文章目录 程序员如何搞副业&#xff1f;强烈推荐引言&#xff1a;ReentrantLock介绍可重入性&#xff08;Reentrancy&#xff09;&#xff1a;公平性&#xff08;Fairness&#xff09;&#xff1a;条件变量&#xff08;Condition&#xff09;&…

Flume在大数据集群下的配置以及监控工具Ganglia的部署安装

前提&#xff1a;需要有三台虚拟机&#xff08;hadoop102,103,104&#xff09;配置好相关基础环境 安装 将安装包上传到/opt/software中 tar -zxf /opt/software/apache-flume-1.9.0-bin.tar.gz -C /opt/module/修改 apache-flume-1.9.0-bin 的名称为 flume mv /opt/module/…

交易猫、闲鱼、转转圈号客服台V4-V5源码

新增转转订单客服、闲鱼。各种反炸客服&#xff0c;更换了UI&#xff01;

RAG技术从入门到精通

LLM之RAG技术从入门到精通 RAG技术介绍诞生背景定义 RAG与微调RAG流程架构RAG三种范式Naive RAGAdvanced RAG预检索过程嵌入后期检索过程RAG管道优化 Modular RAG RAG工作流程企业知识问答知识库RAG评估评价方法独立评估端到端评估 关键指标和能力 RAG优化RAG在企业知识库应用下…

OpenHarmony多媒体-mp3agic

简介 mp3agic 用于读取 mp3 文件和读取/操作 ID3 标签&#xff08;ID3v1 和 ID3v2.2 到 ID3v2.4&#xff09;,协助开发者处理繁琐的文件操作相关&#xff0c;多用于操作文件场景的业务应用。 效果展示&#xff1a; 下载安装 ohpm install ohos/mp3agicOpenHarmony ohpm环境配…

MySQL的事务相关的语句的使用

MySQL的事务相关的语句的使用 事务是数据库管理系统执行过程中的一个程序单位&#xff0c;由一个或多个数据库操作组成。MySQL作为一款流行的关系型数据库管理系统&#xff0c;支持事务处理&#xff0c;允许用户定义一系列的操作&#xff0c;这些操作要么完全执行&#xff0c;…

西安大秦时代

西安大秦时代 大秦软件 公司简介 about us 西安大秦时代是技术型公司&#xff0c;技术领先是我们赖以生存的 基础&#xff01;服务是技术的延续&#xff0c;让客户满意&#xff0c;是我们服务的目 标&#xff0c;也是公司的生存之本&#xff01; 产品服务 西安大秦时代拥有…

【面试经典 150 | 数组】最后一个单词的长度

文章目录 写在前面Tag题目来源解题思路方法一&#xff1a;遍历 写在最后 写在前面 本专栏专注于分析与讲解【面试经典150】算法&#xff0c;两到三天更新一篇文章&#xff0c;欢迎催更…… 专栏内容以分析题目为主&#xff0c;并附带一些对于本题涉及到的数据结构等内容进行回顾…

Hdu1068 Girls and Boys【二分图最大独立集】

Girls and Boys 题意 有 n n n 个学生&#xff0c;每个学生可能和若干个其他异性学生有过恋爱关系 现在要选择一些学生形成集合&#xff0c;使得集合内任意两个学生之间都没有过恋爱关系 思路 把学生抽象成点&#xff0c;恋爱关系抽象成边&#xff0c;题意即是求&#xff1…

ASP.NET基于WEB的选课系统

摘要 设计本系统的目的是对选课信息进行管理。学生选课系统维护模块主要完成的是系统管理与维护功能。课题研究过程中&#xff0c;首先对系统管理模块进行了详尽的需求分析&#xff0c;经分析得到系统管理模块主要完成如下的功能&#xff1a;用户基本信息、选课信息的录入,查看…

腾讯云优惠服务器购买攻略,想省钱,看这篇文章就够了

购买腾讯云服务器省钱攻略&#xff0c;先搞个腾讯云新用户身份&#xff0c;然后先领取云服务器优惠代金券&#xff0c;最后在腾讯云官方特价活动上下单购买。目前腾讯云服务器优惠价格61元一年、新老同享2核2G4M带宽99元一年、2核4G5M服务器165元一年、4核8G服务器646元15个月&…

基于Vue3的openlayers地图显示

基于Vue3的openlayers地图显示 &#xff08;1&#xff09;接着上一篇将讲&#xff0c;在components文件夹下创建BaseMap.vue文件夹 &#xff08;2&#xff09;在App.vue文件里面引入BaseMap.vue文件&#xff0c;如下代码所示&#xff1a; &#xff08;3&#xff09;在BaseMa…

upload-labs第十七十八关

第十七关 $is_upload false; $msg null;if(isset($_POST[submit])){$ext_arr array(jpg,png,gif);$file_name $_FILES[upload_file][name];$temp_file $_FILES[upload_file][tmp_name];$file_ext substr($file_name,strrpos($file_name,".")1);$upload_file …

上位机图像处理和嵌入式模块部署(树莓派4b进行驱动的编写)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 树莓派4b上面还支持驱动代码的编写&#xff0c;这是我没有想到的。这里驱动&#xff0c;更多的是一种框架的编写&#xff0c;不一定是编写真正的驱…