• 力扣刷题篇之数与位2


    系列文章目录


    目录

    系列文章目录

    前言

    数值计算

    总结


    前言

     本系列是个人力扣刷题汇总,本文是数与位。刷题顺序按照[力扣刷题攻略] Re:从零开始的力扣刷题生活 - 力扣(LeetCode)

     

    数值计算

    415. 字符串相加 - 力扣(LeetCode)

    1. class Solution {
    2. public String addStrings(String num1, String num2) {
    3. StringBuilder sb = new StringBuilder();
    4. int carry = 0, i = num1.length()-1, j = num2.length()-1;
    5. while(i >= 0 || j >= 0 || carry != 0){
    6. if(i>=0) carry += num1.charAt(i--)-'0';
    7. if(j>=0) carry += num2.charAt(j--)-'0';
    8. sb.append(carry%10);
    9. carry /= 10;
    10. }
    11. return sb.reverse().toString();
    12. }
    13. }

    43. 字符串相乘 - 力扣(LeetCode)

    1. class Solution {
    2. public String multiply(String num1, String num2) {
    3. int len1 = num1.length(),len2 = num2.length();
    4. if (len1 == 1 && num1.charAt(0) - '0' == 0
    5. || len2 == 1 && num2.charAt(0) - '0' == 0) {
    6. return "0";
    7. }
    8. int [] sums = new int [len1+len2];
    9. int [] nums1 = new int [len1];
    10. for (int i = 0; i < len1; i++) {
    11. nums1[i] = num1.charAt(i) - '0';
    12. }
    13. for(int i=0;i
    14. int mul = num2.charAt(len2-1-i)-'0';
    15. for(int j=0;j
    16. sums[i+j]+=(mul*nums1[len1-1-j]);
    17. }
    18. }
    19. StringBuilder str = new StringBuilder();
    20. for(int i=0;i
    21. if(sums[i]>=10){
    22. sums[i+1] +=sums[i]/10;
    23. sums[i]%=10;
    24. }
    25. if(i==sums.length-1&&sums[i]==0)
    26. continue;
    27. str.append(sums[i]);
    28. }
    29. return str.reverse().toString();
    30. }
    31. }

     

    使用了一个链表来存储整数的每一位,并在这个链表上进行操作。整体思路是从后往前找到第一个递增的位置 i,然后在 [i+1, t.size()-1] 范围内找到比 i 位置大的最小的数,与 i 位置交换,再调整 [i+1, t.size()-1] 的顺序,最后检查是否越界。如果不越界,返回调整后的整数,否则返回 -1。 

    1. class Solution {
    2. public int nextGreaterElement(int n) {
    3. if(n == Integer.MAX_VALUE) return -1;
    4. LinkedList t = new LinkedList<>();
    5. while (n != 0) {
    6. t.addFirst(n % 10);
    7. n = n / 10;
    8. }
    9. for (int i = t.size() - 2; i >= 0; --i) {
    10. if (t.get(i) < t.get(i + 1)) {
    11. //调整i位置即可
    12. //向后找比i大的 最小的数的位置 交换
    13. int targetIndex = i + 1;
    14. for (int j = i + 1; j < t.size(); ++j) {
    15. if (t.get(j) > t.get(i) && t.get(j) <= t.get(targetIndex)) {
    16. targetIndex = j;
    17. }
    18. }
    19. swap(t, i, targetIndex);
    20. //调整从i+1开始到结尾的顺序 [i+1,t.size()-1] 依次递增 保证最小
    21. int l =i+1,r=t.size()-1;
    22. while(l
    23. swap(t,l++,r--);
    24. }
    25. //判断一下调整完之后是不是越界了
    26. long res = 0;
    27. for (int k = 0; k < t.size(); ++k) {
    28. res = res * 10 + t.get(k);
    29. }
    30. if(res >Integer.MAX_VALUE) return -1;
    31. return (int)res;
    32. }
    33. }
    34. return -1;
    35. }
    36. private void swap(LinkedList t, int a, int b) {
    37. int tmp = t.get(a);
    38. t.set(a, t.get(b));
    39. t.set(b, tmp);
    40. }
    41. }

    9. 回文数 - 力扣(LeetCode)

     通过反转整数的一半来判断是否为回文数。在反转的过程中,如果反转的数字大于剩余的数字,就可以停止,因为已经检查过一半了。最后,比较原始数字和反转后的数字,如果相等,或者相等除以 10(对于偶数位数的数字),则是回文数。此解法的时间复杂度为 O(log n)。

    1. class Solution {
    2. public boolean isPalindrome(int x) {
    3. // 负数和以0结尾但不是0的数不是回文数
    4. if (x < 0 || (x % 10 == 0 && x != 0)) {
    5. return false;
    6. }
    7. int revertedNumber = 0;
    8. // 反转 x 的一半数字
    9. while (x > revertedNumber) {
    10. revertedNumber = revertedNumber * 10 + x % 10;
    11. x /= 10;
    12. }
    13. // 对于奇数位数的数字,revertedNumber 的最后一位是中间位,不影响回文判断
    14. // 对于偶数位数的数字,x 和 revertedNumber 必须完全相等
    15. return x == revertedNumber || x == revertedNumber / 10;
    16. }
    17. }

    使用了递归的思想。如果一个数字大于等于 10,就继续将其各个位数相加,直到得到一个一位数为止。递归函数的返回值即为最终的结果。 

    1. class Solution {
    2. public int addDigits(int num) {
    3. if (num < 10) {
    4. return num;
    5. }
    6. return addDigits(num / 10+ num % 10);
    7. }
    8. }

    461. 汉明距离 - 力扣(LeetCode)

     首先计算了两个整数的异或结果,然后遍历这个异或结果的每一位,通过与 1 进行位与操作统计不同位的数量。

    1. class Solution {
    2. public int hammingDistance(int x, int y) {
    3. // 0 0 0 1 (1)
    4. // 0 1 0 0 (4)
    5. //^ 0 1 0 1 (5)
    6. //& 0 0 0 1 (1)
    7. // ------
    8. // 0 0 0 1 (结果)
    9. int t = x ^ y;
    10. int count = 0;
    11. while(t != 0) {
    12. // 将 num 与 1 进行位与操作,统计最低位是否为1
    13. count += (t & 1);
    14. // // 将 num 右移一位
    15. t = t >> 1;
    16. }
    17. return count;
    18. }
    19. }

    477. 汉明距离总和 - 力扣(LeetCode)

    使用了位运算。对于每个二进制位,它统计在该位上为 1 的元素个数 n,然后计算当前位上的汉明距离,并将其累加到结果中。最终返回总的汉明距离。这种方法的时间复杂度是 O(32n),可以在线性时间内完成计算。 

    1. class Solution {
    2. public int totalHammingDistance(int[] nums) {
    3. int res = 0;
    4. int m = nums.length;
    5. // 遍历每个二进制位(最多 30 位)
    6. for (int i = 0; i <= 30; i++) {
    7. int n = 0;
    8. // 统计在当前位上为1的元素个数
    9. for (int num : nums) {
    10. n += (num >>> i) & 1;
    11. }
    12. // 计算当前位上的汉明距离,并累加到结果中
    13. res += (m - n) * n;
    14. }
    15. return res;
    16. }
    17. }


    总结

    把数与位的第二部分数值计算写完了,好简单!(最后这个累加汉明距离的要记牢。)我好爱哈哈哈哈,继续加油,多敲多敲,我要找实习了。

  • 相关阅读:
    基于springboot+vue的房屋出租租赁系统 elementui
    『算法导论』什么是算法?什么是程序?
    django 自动化脚本的开发 - 脚本仅启动运行一次 / 执行定时任务 - 测试过程
    CIKM 2022 | HGANDTI: 药物-靶点相互作用预测的异构图注意网络
    【记录】celery + mongodb 动态添加、更新定时任务时间
    【精讲】vue 生命周期函数及子传父方法二
    lightdb UPDATE INDEXES自动分区转换支持全大写索引名
    深入解析 Redis 分布式锁原理
    drools项目中dmn文件调用自定义的java类
    TFA-Amino modifier CPG 500;TFA氨基改性剂CPG 500
  • 原文地址:https://blog.csdn.net/m0_66076989/article/details/134431174