• 每日5题Day14 - LeetCode 66 - 70


    每一步向前都是向自己的梦想更近一步,坚持不懈,勇往直前!

    第一题:66. 加一 - 力扣(LeetCode)

    1. class Solution {
    2. public int[] plusOne(int[] digits) {
    3. int carry = 1;
    4. List res = new ArrayList<>();
    5. //反着来,把低位的元素先放进list中
    6. for(int i = digits.length - 1; i > -1; i--){
    7. res.add((digits[i] + carry) % 10);
    8. carry = (digits[i] + carry) / 10;
    9. }
    10. //最高位可能要进位
    11. if(carry == 1){
    12. res.add(carry);
    13. }
    14. //因为刚才反了,所以最后要反着放回来
    15. int[] ress = new int[res.size()];
    16. for(int i = 0; i < res.size(); i++){
    17. ress[res.size() - 1 - i] = res.get(i);
    18. }
    19. return ress;
    20. }
    21. }

    第二题:67. 二进制求和 - 力扣(LeetCode)

    1. class Solution {
    2. public String addBinary(String a, String b) {
    3. //和上一题相同,反着来
    4. if (a.length() == 0 && b.length() == 0) {
    5. return "";
    6. }
    7. if (a.length() == 0 || b.length() == 0) {
    8. return a.length() == 0 ? b : a;
    9. }
    10. int carry = 0;
    11. StringBuilder sb = new StringBuilder();
    12. int i = a.length() - 1;
    13. int j = b.length() - 1;
    14. while (i >= 0 || j >= 0 || carry > 0) {
    15. int sum = carry;
    16. if (i >= 0) {
    17. sum += a.charAt(i--) - '0';
    18. }
    19. if (j >= 0) {
    20. sum += b.charAt(j--) - '0';
    21. }
    22. sb.append(sum % 2);
    23. carry = sum / 2;
    24. }
    25. return sb.reverse().toString();
    26. }
    27. }

    第三题:68. 文本左右对齐 - 力扣(LeetCode)

    写不来,就用宫水三叶的解法吧

    1. class Solution {
    2. public List fullJustify(String[] words, int maxWidth) {
    3. List ans = new ArrayList<>();
    4. int n = words.length;
    5. List list = new ArrayList<>();
    6. for (int i = 0; i < n; ) {
    7. // list 装载当前行的所有 word
    8. list.clear();
    9. list.add(words[i]);
    10. int cur = words[i++].length();
    11. while (i < n && cur + 1 + words[i].length() <= maxWidth) {
    12. cur += 1 + words[i].length();
    13. list.add(words[i++]);
    14. }
    15. // 当前行为最后一行,特殊处理为左对齐
    16. if (i == n) {
    17. StringBuilder sb = new StringBuilder(list.get(0));
    18. for (int k = 1; k < list.size(); k++) {
    19. sb.append(" ").append(list.get(k));
    20. }
    21. while (sb.length() < maxWidth) sb.append(" ");
    22. ans.add(sb.toString());
    23. break;
    24. }
    25. // 如果当前行只有一个 word,特殊处理为左对齐
    26. int cnt = list.size();
    27. if (cnt == 1) {
    28. String str = list.get(0);
    29. while (str.length() != maxWidth) str += " ";
    30. ans.add(str);
    31. continue;
    32. }
    33. /**
    34. * 其余为一般情况
    35. * wordWidth : 当前行单词总长度;
    36. * spaceWidth : 当前行空格总长度;
    37. * spaceItem : 往下取整后的单位空格长度
    38. */
    39. int wordWidth = cur - (cnt - 1);
    40. int spaceWidth = maxWidth - wordWidth;
    41. int spaceItemWidth = spaceWidth / (cnt - 1);
    42. String spaceItem = "";
    43. for (int k = 0; k < spaceItemWidth; k++) spaceItem += " ";
    44. StringBuilder sb = new StringBuilder();
    45. for (int k = 0, sum = 0; k < cnt; k++) {
    46. String item = list.get(k);
    47. sb.append(item);
    48. if (k == cnt - 1) break;
    49. sb.append(spaceItem);
    50. sum += spaceItemWidth;
    51. // 剩余的间隙数量(可填入空格的次数)
    52. int remain = cnt - k - 1 - 1;
    53. // 剩余间隙数量 * 最小单位空格长度 + 当前空格长度 < 单词总长度,则在当前间隙多补充一个空格
    54. if (remain * spaceItemWidth + sum < spaceWidth) {
    55. sb.append(" ");
    56. sum++;
    57. }
    58. }
    59. ans.add(sb.toString());
    60. }
    61. return ans;
    62. }
    63. }

    第四题:69. x 的平方根 - 力扣(LeetCode)

    1. class Solution {
    2. public int mySqrt(int x) {
    3. if (x == 0) {
    4. return 0;
    5. }
    6. int left = 1;
    7. int right = x;
    8. int ans = 0;
    9. //二分法
    10. while (left <= right) {
    11. int mid = left + (right - left) / 2;
    12. if (mid <= x / mid) {
    13. ans = mid;
    14. left = mid + 1;
    15. } else {
    16. right = mid - 1;
    17. }
    18. }
    19. return ans;
    20. }
    21. }

     第五题:70. 爬楼梯 - 力扣(LeetCode)

    1. class Solution {
    2. public int climbStairs(int n) {
    3. //两个方向换过来
    4. int[] dp = new int[n + 1];
    5. dp[0] = 1;
    6. dp[1] = 1;
    7. for(int i = 2; i <= n; i++){
    8. dp[i] = dp[i - 1] + dp[i - 2];
    9. }
    10. return dp[n];
    11. }
    12. }

  • 相关阅读:
    线程池详解及完整代码实现
    清华大牛终于把「图解计算机网络、操作系统」学习笔记总结出来了
    Senparc.Weixin SDK 微信平台开发教程(二十四):顺应 AIGC 应用,自动“续航”回复超长文本消息
    c++内存管理
    Eclipse的安装以及环境配置
    N-羟乙基-1,8-萘二甲酰亚胺四苯乙烯衍生物聚集诱导发光微球/AIE席夫碱化合物的研究制备
    OMS 3.4.0 发布,打造更安全易用的数据迁移体验
    轴承图片数据集分类效果测试
    6个最常用的Three.js后期处理效果
    链式队列----数据结构
  • 原文地址:https://blog.csdn.net/alimamaalala/article/details/139349036