Java教程

HW OD岗手撕题

本文主要是介绍HW OD岗手撕题,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
//给定两个字符串形式的非负整数 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

 

这篇关于HW OD岗手撕题的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!