LeetCode(2 & 43):两数相加 & 字符串相乘 Add Two Numbers & Multiply Strings(Java)

2019.4.10 #程序员笔试必备# LeetCode 从零单刷个人笔记整理(持续更新)

最近刷题效率有点高,如果按照这个刷题速度和博客更新速度进行下去,可能毕业之前或者刷完题之前没法更新完博客了。
这道两数相加的题目如果出成笔试题,直接换成字符串可以很快解决。
如果不转字符串要强行做的话,可以直接模拟小学手算加法公式进行计算。
字符串相乘同理。


传送门:两数相加

You are given two non-empty linked lists representing two non-negative integers. The digits are stored in reverse order and each of their nodes contain a single digit. Add the two numbers and return it as a linked list.

You may assume the two numbers do not contain any leading zero, except the number 0 itself.

给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。

如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。

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

示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807



/**
 * 
 * @author ChopinXBP
 * You are given two non-empty linked lists representing two non-negative integers.
 * The digits are stored in reverse order and each of their nodes contain a single digit.
 * Add the two numbers and return it as a linked list.
 * You may assume the two numbers do not contain any leading zero, except the number 0 itself.
 * 给出两个 非空 的链表用来表示两个非负的整数。
 * 其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
 * 如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
 * 您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
 * 
 */

public class addTwoNumbers {
     
	
	public static class ListNode {
     
		int val;
		ListNode next;

		ListNode(int x) {
     
			val = x;
		}
	}
	
	public static void main(String[] args) {
     
		// TODO Auto-generated method stub
		
	}
	
    public static ListNode addTwoNumbers(ListNode l1, ListNode l2) {
     
        if(l1 == null && l2 == null)return null;
        ListNode p1 = l1;
        ListNode p2 = l2;
        
        ListNode head = new ListNode(0);
        ListNode ph = head;
        
        int sum;
        int flag = 0;
        while(p1 != null || p2 != null) {
     

        	if(p1 == null) {
     
        		sum = p2.val + flag;
        		p2 = p2.next;
        	}
        	else if(p2 == null){
     
        		sum = p1.val + flag;
        		p1 = p1.next;
        	}
        	else {
     
        		sum = p1.val + p2.val + flag;
        		p1 = p1.next;
        		p2 = p2.next;
        	}
        	
        	if(sum > 9) {
     
        		flag = 1;
        		sum %= 10;
        	}else {
     
        		flag = 0;
        	}
        	
        	ListNode newnode = new ListNode(sum);
        	ph.next = newnode;
        	ph = ph.next;
        }
        
        if(flag == 1) {
     
        	ListNode newnode = new ListNode(1);
        	ph.next = newnode;
        }
        
        return head.next;
    }	

}



传送门:字符串相乘

Given two non-negative integers num1 and num2 represented as strings, return the product of num1 and num2, also represented as a string.

The length of both num1 and num2 is < 110.

Both num1 and num2 contain only digits 0-9.

Both num1 and num2 do not contain any leading zero, except the number 0 itself.

You must not use any built-in BigInteger library or convert the inputs to integer directly.

给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。

num1 和 num2 的长度小于110。

num1 和 num2 只包含数字 0-9。

num1 和 num2 均不以零开头,除非是数字 0 本身。

不能使用任何标准库的大数类型(比如 BigInteger)或直接将输入转换为整数来处理。

示例 1:
输入: num1 = "2", num2 = "3"
输出: "6"

示例 2:
输入: num1 = "123", num2 = "456"
输出: "56088"


/**
 * 
 * @author ChopinXBP
 * Given two non-negative integers num1 and num2 represented as strings, return the product of num1 and num2, also represented as a string.
 * The length of both num1 and num2 is < 110.
 * Both num1 and num2 contain only digits 0-9.
 * Both num1 and num2 do not contain any leading zero, except the number 0 itself.
 * You must not use any built-in BigInteger library or convert the inputs to integer directly.
 * 给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。
 * num1 和 num2 的长度小于110。
 * num1 和 num2 只包含数字 0-9。
 * num1 和 num2 均不以零开头,除非是数字 0 本身。
 * 不能使用任何标准库的大数类型(比如 BigInteger)或直接将输入转换为整数来处理。
 *
 */

public class MultiplyStrings {
     

	public static void main(String[] args) {
     
		// TODO Auto-generated method stub
		System.out.println(multiply("623", "23"));
		System.out.println(multiply("623", "13"));
	}

	//模拟小学列式手算乘法公式
    public static String multiply(String num1, String num2) {
     
        if(num1 == null || num1.length() == 0 || num2 == null || num2.length() == 0)
        	return "";
        
        
        //保证num1为位数较少的数字,简化计算
        if(num1.length() > num2.length()) {
     
        	String temp = num1;
        	num1 = num2;
        	num2 = temp;
        }
        if(num1.length() == 1 && num1.equals("0"))
        	return "0";
        
        int len1 = num1.length();
        int len2 = num2.length();        
        
        //用一个len1+len2列的矩阵存放临时运算结果
        int[] matrix = new int[len1 + len2];
        
        int flag = 0;	//每次乘积结果位移       	
        for(int i = len1 - 1; i >= 0; i--) {
     
        	int muln1 = num1.charAt(i) - '0';       	
        	int carrybit = 0;	//记录每次运算的进位
        	for(int j = len2 - 1; j >= 0; j--) {
     
        		int sum = muln1 * (num2.charAt(j) - '0') + carrybit + matrix[len2 - 1 - j + flag];
        		matrix[len2 - 1 - j + flag] = sum % 10;
        		carrybit = sum / 10;
        	}
        	matrix[len2 + flag] = carrybit;
        	flag++;
        }
        
        StringBuilder result = new StringBuilder();
        for(int i = len1 + len2 - 1; i >= 0; i--) {
     
        	result.append(matrix[i]);
        }
        
        //除去最高的0位
        if(result.charAt(0) == '0') {
     
        	result.deleteCharAt(0);
        }
        return result.toString();
    }
}


#Coding一小时,Copying一秒钟。留个言点个赞呗,谢谢你#

你可能感兴趣的:(数据结构与算法,JAVA,LeetCode,数据结构与算法,LeetCode,链表,字符串)