//给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和。 // // 注意: // // num1 和num2 的长度都小于 5100. // // num1 和num2 都只包含数字 0-9. // // num1 和num2 都不包含任何前导零。 // // 你不能使用任何內建 BigInteger 库, 也不能直接将输入的字符串转换为整数形式。 PS : 白天没睡中午觉,脑子的确不够灵光,然后算法的东西,只要给时间,似乎都能做出来,哪怕代码再辣鸡。
1 import java.util.HashMap; 2 import java.util.Map; 3 4 public class TEST { 5 6 private static Map<String, Integer> mapString2Integer = new HashMap<>(); 7 8 static class AddResult { 9 private Integer data; // 进行加法后个位数值上的数据. 10 private Boolean carryBit; // 是否有进位. 11 12 AddResult(){ 13 reset(); 14 } 15 16 AddResult(Integer data, Boolean carryBit){ 17 this.data = data; 18 this.carryBit = carryBit; 19 } 20 21 public Integer getData() { 22 return data; 23 } 24 25 public void setData(Integer data) { 26 this.data = data; 27 } 28 29 public Boolean getCarryBit() { 30 return carryBit; 31 } 32 33 public void setCarryBit(Boolean carryBit) { 34 this.carryBit = carryBit; 35 } 36 37 public void reset() { 38 data = 0; 39 carryBit = false; 40 } 41 } 42 43 public static void initMap() { 44 mapString2Integer.put("0", 0); 45 mapString2Integer.put("1", 1); 46 mapString2Integer.put("2", 2); 47 mapString2Integer.put("3", 3); 48 mapString2Integer.put("4", 4); 49 mapString2Integer.put("5", 5); 50 mapString2Integer.put("6", 6); 51 mapString2Integer.put("7", 7); 52 mapString2Integer.put("8", 8); 53 mapString2Integer.put("9", 9); 54 55 } 56 57 58 public static AddResult add(String ch1, String ch2) { 59 Integer n1 = mapString2Integer.get(ch1); 60 Integer n2 = mapString2Integer.get(ch2); 61 assert (n1 != null); 62 assert (n2 != null); 63 Integer n = n1 + n2; 64 return (new AddResult(n % 10, n >= 10 ? Boolean.TRUE : Boolean.FALSE)); 65 } 66 67 public static AddResult add(String ch1, String ch2, String ch3) { 68 Integer n1 = mapString2Integer.get(ch1); 69 Integer n2 = mapString2Integer.get(ch2); 70 Integer n3 = mapString2Integer.get(ch3); 71 assert (n1 != null); 72 assert (n2 != null); 73 assert (n3 != null); 74 Integer n = n1 + n2 + n3; 75 return (new AddResult(n % 10, n >= 10 ? Boolean.TRUE : Boolean.FALSE)); 76 } 77 78 79 public static String fun(String num1, String num2) { 80 StringBuffer sbf = new StringBuffer(); 81 String strLong, strShort; 82 if (num1.length() > num2.length()) { 83 strLong = num1; 84 strShort = num2; 85 } else { 86 strLong = num2; 87 strShort = num1; 88 } 89 90 AddResult ar = new AddResult(); 91 int i = strShort.length() - 1; 92 int j = 0; 93 // 按倒序进行相加操作. 94 for (; i >= 0; i--, j++) { 95 String ch1 = String.valueOf(strShort.charAt(i)); 96 String ch2 = String.valueOf(strLong.charAt(strLong.length() - 1 - j)); 97 ar = add(ch1, ch2, ar.getCarryBit() == Boolean.TRUE ? "1" : "0" ); 98 sbf.append(String.valueOf(ar.getData())); 99 } 100 sbf.reverse(); 101 102 // 若上相加出现进位, 则需要重新检查进位情况. 103 String str = strLong.substring(0, strLong.length() - strShort.length()); 104 if (i == -1 && ar.getCarryBit() == Boolean.TRUE) { 105 int m = str.length() - 1; 106 for (; m >= 0; m--) { 107 String e = String.valueOf(str.charAt(m)); 108 if(ar.getCarryBit() == Boolean.TRUE) { 109 ar = add(e, "1", "0"); 110 sbf.append(ar.getData()); 111 } else { 112 sbf.append(e); 113 } 114 } 115 116 // 即时是遍历完一遍长数据高位了,还是要多检查一次进位情况. 117 if(m == -1 && ar.getCarryBit() == Boolean.TRUE) { 118 sbf.insert(0, "1"); 119 } 120 } 121 // 未发现进位则直接将多余的高位长度数据往前插入即可. 122 else { 123 sbf.insert(0, str); 124 } 125 126 return sbf.toString(); 127 } 128 129 public static void main(String[] args) { 130 initMap(); 131 System.out.println(fun("456", "789")); 132 System.out.println(fun("999", "1")); 133 134 System.out.println(fun("55555", "55555")); 135 System.out.println(fun("64", "36")); 136 System.out.println(fun("123456789", "987654321")); 137 138 System.out.println(fun("22", "333")); 139 } 140 }View Code