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一秒钟。留个言点个赞呗,谢谢你#