leetcode题记:Add Binary

迷南。 2022-05-19 09:28 256阅读 0赞

编程语言:JAVA

题目描述:

  1. Given two binary strings, return their sum (also a binary string).
  2. The input strings are both non-empty and contains only characters 1 or 0.
  3. Example 1:
  4. Input: a = "11", b = "1"
  5. Output: "100"
  6. Example 2:
  7. Input: a = "1010", b = "1011"
  8. Output: "10101"

提交反馈:

  1. 294 / 294 test cases passed.
  2. Status: Accepted
  3. Runtime: 26 ms
  4. Submitted: 0 minutes ago
  5. You are here!
  6. Your runtime beats 2.62 % of java submissions.

解题思路:

  1. 博主自认为解题思路较清晰、简单。但是无奈,提交后的运行时间太久,属于垫底的水平。
  2. 解题思路主要有以下几步:
  3. 1、将a赋值为较长的字符串,b赋值为较短的字符串(方便后面操作)
  4. 2、将两个字符串补0对齐,使其长度变为一样长
  5. 3、设置一个进位flagflag初始化为0
  6. 4、用a.charAt(i)-48b.charAt(i)-48分别求出这两个值,并与flag求和,计为sum
  7. 5、若sum=3,对应位置值为1flag1;若sum=2,对应位置值为0flag1;若sum=1,对应位置值为1flag0;若sum=0,对应位置值为0flag0
  8. 6、用StringBufferappend()方法向末尾添加字符串,然后用StringBufferreverse()方法逆置,用StringBuffertoString()方法转化为字符串;
  9. 但是经过提交结果,发现,这个方法运行时间比较久,上网查看大神代码。

代码:

  1. class Solution {
  2. public String addBinary(String a, String b) {
  3. // 将a赋值为叫=较长的字符串,b赋值为较短的字符串
  4. if(a.length() < b.length()){
  5. String tmp = a;
  6. a = b;
  7. b = tmp;
  8. }
  9. // 将两个字符串对齐,长度补0变为一样长
  10. int cha = a.length()-b.length();
  11. StringBuffer s0 = new StringBuffer();
  12. int i = 0;
  13. while(i < cha){
  14. s0.append("0");
  15. i += 1;
  16. }
  17. b = s0.toString() + b;
  18. // 定义一个存储结果的StringBuffer
  19. StringBuffer res = new StringBuffer();
  20. // 将两个长度相等的字符串相加,定义一个进位标志flag
  21. int flag = 0;
  22. int j = b.length() - 1;
  23. while(j >= 0){
  24. int a_curr = a.charAt(j)-48;
  25. int b_curr = b.charAt(j)-48;
  26. int sum = flag + a_curr + b_curr;
  27. if(sum == 2){
  28. res = res.append("0");
  29. flag = 1;
  30. }
  31. else if(sum == 3){
  32. res = res.append("1");
  33. flag = 1;
  34. }
  35. else{
  36. String s_tmp = String.format("%s",sum);
  37. res = res.append(s_tmp);
  38. flag = 0;
  39. }
  40. j -= 1;
  41. }
  42. // 判断进位flag是否为0,否则前面补0
  43. if(flag == 1){
  44. res = res.append("1");
  45. }
  46. return res.reverse().toString();
  47. }
  48. }

代码改进:

  1. 当我将对应部分改为下面斜杠部分所示时,运行时间神奇的缩短了
  2. 294 / 294 test cases passed.
  3. Status: Accepted
  4. Runtime: 3 ms
  5. You are here!
  6. Your runtime beats 41.22 % of java submissions.
  7. 仅仅做了这么一小点的改动,平均运行时间由原来的26毫秒缩短到23毫秒,难以想象,真的是很可怕的一个数字啊。
  8. 我做了实验,运行十次String.format(),发现十次的这个操作竟然需要14ms
  9. 所以啊,在以后的程序中,尽量能不用String.format()就不用吧,这个函数的性能太低了。
  10. class Solution {
  11. public String addBinary(String a, String b) {
  12. // 将a赋值为叫=较长的字符串,b赋值为较短的字符串
  13. if(a.length() < b.length()){
  14. String tmp = a;
  15. a = b;
  16. b = tmp;
  17. }
  18. // 将两个字符串对齐,长度补0变为一样长
  19. int cha = a.length()-b.length();
  20. StringBuffer s0 = new StringBuffer();
  21. int i = 0;
  22. while(i < cha){
  23. s0.append("0");
  24. i += 1;
  25. }
  26. b = s0.toString() + b;
  27. // 定义一个存储结果的StringBuffer
  28. StringBuffer res = new StringBuffer();
  29. // 将两个长度相等的字符串相加,定义一个进位标志flag
  30. int flag = 0;
  31. int j = b.length() - 1;
  32. while(j >= 0){
  33. int a_curr = a.charAt(j)-48;
  34. int b_curr = b.charAt(j)-48;
  35. int sum = flag + a_curr + b_curr;
  36. if(sum == 2){
  37. res = res.append("0");
  38. flag = 1;
  39. }
  40. else if(sum == 3){
  41. res = res.append("1");
  42. flag = 1;
  43. }
  44. ///////////////////////////////////////////////////////////////
  45. else if(sum == 1){
  46. res = res.append("1");
  47. flag = 0;
  48. }
  49. else{
  50. res = res.append("0");
  51. flag = 0;
  52. }
  53. ///////////////////////////////////////////////////////////////
  54. j -= 1;
  55. }
  56. // 判断进位flag是否为0,否则前面补0
  57. if(flag == 1){
  58. res = res.append("1");
  59. }
  60. return res.reverse().toString();
  61. }
  62. }

发表评论

表情:
评论列表 (有 0 条评论,256人围观)

还没有评论,来说两句吧...

相关阅读