您的位置:首页 > 其它

leetcodes-2 :两数相加(数组解决方案)(链表解决方案) ★★★

2019-03-24 21:05 281 查看
版权声明:wx: Symirror https://blog.csdn.net/qq_41960416/article/details/88782128

两数相加

  • LeetCode_1解决方案描述<链表>
  • 问题描述

    创建两个非空数组(链表)存储两个用户输入的整数,按顺序将个十百千万…存储,然后在数组(链表)中将两数相加的结果返回到一个新的数组(链表)中。

    My 解决方案描述<数组>

    1.获取两个输入数组中的较长长度L,并new一个新的数组长度L+1。
    2.将两个数组对应的每一位相加,并将结果存放在新数组的对应位。
    2.进位调整:由于每个项只能存放个位数,进位部分要赋予下一个项。

    My 源代码<数组>(java)

    public class Demo02_addTwoNumber {
    
    public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    // 请输入第一个整数
    System.out.println("请输入第一个加数");
    int n1 = sc.nextInt();
    Number x = new Number(n1);
    // 请输入第二个整数
    System.out.println("请输入第二个加数");
    int n2 = sc.nextInt();
    Number y = new Number(n2);
    
    // 进行运算
    System.out.println("加法运算结果是:");
    Number z = x.add(y);
    
    // 测试
    z.printNumber();
    }
    
    }
    
    class Number {
    private int[] arr;
    
    public Number() {
    
    }
    
    public Number(int i) {
    // 统计数组长度
    int bn = 1;
    int temp = i;
    while ((temp = temp / 10) != 0) {
    bn++;
    }
    // 创建数组
    this.arr = new int[bn];
    
    // 填充数组
    for (int index = 0; index < bn; index++) {
    arr[index] = i % 10;
    i = i / 10;
    }
    }
    
    // 定义运算方法
    public Number add(Number yArr) {
    
    int l = this.arr.length > yArr.arr.length ? this.arr.length // 获取较长位数
    : yArr.arr.length;
    int s = this.arr.length < yArr.arr.length ? this.arr.length // 获取较短位数
    : yArr.arr.length;
    
    int[] z = new int[l + 1];
    int carry = 0;// 用于处理进位的临时变量
    for (int index = 0; index < l + 1; index++) {
    
    if (index < s) { // 对于两加数字共同下标
    z[index] = (this.getArr()[index] + yArr.getArr()[index] + carry) % 10;
    carry = (this.getArr()[index] + yArr.getArr()[index] + carry) / 10;
    } else if (index < l) { // 对于较长加数独有下标
    if (this.arr.length > yArr.arr.length) {
    z[index] = (this.getArr()[index] + carry) % 10;
    carry = (this.getArr()[index] + +carry) / 10;
    } else {
    z[index] = (yArr.getArr()[index] + carry) % 10;
    carry = (yArr.getArr()[index] + carry) / 10;
    }
    } else { // 最后一位(如果有的话)
    z[index] = carry;
    }
    
    }
    Number zArr = new Number();
    zArr.setArr(z);
    return zArr;
    }
    
    // 生成GET和SET方法
    public int[] getArr() {
    return arr;
    }
    
    public void setArr(int[] arr) {
    this.arr = arr;
    }
    
    // 创建打印数字的方法
    public void printNumber() {
    // 从最高位开始打印(先判断数组最后一位是否为最高位,即是否为0)
    if (this.arr[this.arr.length - 1] != 0) {
    System.out.print(this.arr[this.arr.length]);
    }
    for (int index = this.arr.length - 2; index >= 0; index--) {
    System.out.print(this.arr[index]);
    }
    
    }
    
    }

    LeetCode_1解决方案描述<链表>

    LeetCode_1 源代码<链表> (java)

    /**
    * Add Two Numbers
    * 两数相加
    */
    
    //创建结点类
    public class ListNode {
    public int val;   //结点值
    public ListNode next;    //结点链指针
    
    public ListNode(int i) {   //有参构造
    this.val = i;
    }
    
    public int val() {         //获取结点值
    return val;
    }
    }
    
    //创建add方法 (产生结果并且放入新链表)
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
    ListNode dummyHead = new ListNode(0);    //创建新链表的头结点
    ListNode p = l1, q = l2, curr = dummyHead;     //获取运算对象
    int carry = 0;   //进位临时变量
    while (p != null || q != null) {
    int x = (p != null) ? p.val : 0;     //获取加数 x
    int y = (q != null) ? q.val : 0;     //获取加数 y
    int sum = carry + x + y;        //运算
    carry = sum / 10;                //获取进位
    curr.next = new ListNode(sum % 10);       //生成新链表的下一个结点
    curr = curr.next;               //移动指针
    if (p != null) p = p.next;     //移动指针
    if (q != null) q = q.next;     //移动指针
    }
    if (carry > 0) {
    curr.next = new ListNode(carry);
    }
    return dummyHead.next;
    }
    内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
    标签: