大數加法
- 題目來源:
- 易錯點注意:
- 題目分析
- 具體實作
題目來源:
本題目是來自牛客網的在線編程題目:詳情請見下面鏈接:
牛客網大數加法
以字串的形式讀入兩個數字,撰寫一個函式計算它們的和,以字串形式回傳,
(字串長度不大于100000,保證字串僅由’0’~'9’這10種字符組成)
import java.util.*;
public class Solution {
/**
* 代碼中的類名、方法名、引數名已經指定,請勿修改,直接回傳方法規定的值即可
* 計算兩個數之和
* @param s string字串 表示第一個整數
* @param t string字串 表示第二個整數
* @return string字串
*/
public String solve(String s, String t) {
// write code here
}
}
易錯點注意:
當我們看到這個題目,需要仔細分析題目,慣性會想到,將兩個字串轉換成數字,然后相加,最后又回傳字串不就好了嘛!
但是問題是大數相加,存在int,long都放不下的問題,所以本題沒有那么簡單,
如下:
public class Solution1 {
public String solve(String s, String t) {
// write code here
int r = Integer.parseInt(s) + Integer.parseInt(t);
return String.valueOf(r);
}
public static void main(String[] args) {
Solution1 s = new Solution1();
String ret = s.solve("99", "10");
System.out.println(ret);
}
}
雖然在處理小的資料的時候結果是對的,但當int,long都放不下的時候,相加,就出錯了,
題目分析
當我們仔細分析題目,可以從以下步驟去解題:
-
將字串轉換成字符陣列
我們可以利用toCharArray(); 去將字串轉換為字符陣列
-
將字符陣列轉換成int型陣列
通過字符減去‘0’,得到其具體數字 -
將int型陣列逆置
-
相加,注意有進位的問題
-
將陣列逆置
-
轉換成字串
注意:
我們還需要注意兩個字串,當其中有一個0,或者兩個都是0的情況
所以,當其中一個為0,直接回傳另外一個,是用來equals比較,
if (s.equals("0")) {
return t;
}
具體實作
import java.util.*;
public class Solution {
/**
* 代碼中的類名、方法名、引數名已經指定,請勿修改,直接回傳方法規定的值即可
* 計算兩個數之和
*
* @param s string字串 表示第一個整數
* @param t string字串 表示第二個整數
* @return string字串
*/
public String solve(String s, String t) {
// write code here
//0.判斷是否有0相加
if (s.equals("0")) {
return t;
}
//1.將字串轉換成字符陣列
char[] a = s.toCharArray();
char[] b = t.toCharArray();
//2.轉換成int陣列
int[] a1 = toIntArr(a);
int[] b1 = toIntArr(b);
//3.逆置陣列
int[] aInt = reverse(a1);
int[] bInt = reverse(b1);
int max = Math.max(aInt.length, bInt.length);
int min = Math.min(aInt.length, bInt.length);
int[] array = new int[max + 1];
//4.相加
//公共的
int carry = 0;
int i;
for (i = 0; i < min; i++) {
int r = aInt[i] + bInt[i] + carry;
array[i] = r % 10;
carry = r / 10;
}
//找到最長的陣列
int[] arrMax = aInt;
if (aInt.length < bInt.length) {
arrMax = bInt;
}
//非公共的
for (; i < max; i++) {
int r = arrMax[i] + carry;
array[i] = r % 10;
carry = r / 10;
}
//最后的進位
array[max] = carry;
//5.將陣列逆置
int[] arrayInt = reverse(array);
//陣列轉字串
char[] arrayChar = new char[arrayInt.length];
for (int j = 0; j < arrayInt.length; j++) {
arrayChar[j] = (char) (arrayInt[j] + '0');
}
String ret = new String(arrayChar);
//判斷首位是否為0
if (ret.charAt(0) == '0') {
ret = ret.substring(1);
}
return ret;
}
private int[] toIntArr(char[] a) {
int[] arr = new int[a.length];
for (int i = 0; i < a.length; i++) {
arr[i] = a[i] - '0';
}
return arr;
}
private int[] reverse(int[] a) {
for (int i = 0; i < a.length / 2; i++) {
int tmp = a[i];
a[i] = a[a.length - 1 - i];
a[a.length - 1 - i] = tmp;
}
return a;
}
public static void main(String[] args) {
// String s = "0";
// String t = "0";
// [0, 1, 1]
String s = "1039";
String t = "28";
// // [7, 6, 0, 1]
Solution solution = new Solution();
System.out.println(solution.solve(s, t));
}
}
結果:

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/255193.html
標籤:java
上一篇:【Mybatis系列】注解
