力扣刷题篇之数与位1

系列文章目录


目录

系列文章目录

前言

一、进制转换

 

总结


前言

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


一、进制转换

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

主要思路是从二进制串的最低位(右边)开始,逐位相加,使用 carry 变量来处理进位。在遍历的过程中,分别处理相等和不相等的情况,并更新结果数组。最后,检查最高位是否有进位,若有,则在结果数组的最前面加上进位。最终返回相加的结果。

注意,在Java中,如果你创建一个字符串数组但还没有为元素分配具体的值,那么数组的元素将被初始化为 null

class Solution {
    public static String addBinary(String a, String b) {
        // 保持a的长度大于等于b的长度,方便处理
        if (a.length() < b.length()) {
            return addBinary(b, a);
        }
        
        // 创建一个字符数组来保存相加的结果,长度为a.length() + 1
        char[] sum = new char[a.length() + 1];
        int indexA = a.length() - 1, diffLen = a.length() - b.length();
        char carry = '0';  // 进位初始为0
        
        // 从右往左遍历a的每一位
        while (indexA > -1) {
            // 获取b的相应位,如果b的长度小于a,超出部分视为0
            char bitB = indexA - diffLen > -1 ? b.charAt(indexA - diffLen) : '0';
            
            // 判断当前位与进位的情况,更新相应位置的值和进位
            if (a.charAt(indexA) == bitB) {
                sum[indexA-- + 1] = carry;
                carry = bitB;
            } else {
                sum[indexA-- + 1] = carry == '0' ? '1' : '0';
            }
        }
        
        // 处理最高位的进位
        sum[0] = carry;
        
        // 返回相加的结果,去掉可能多余的前导零
        return carry == '1' ? new String(sum, 0, a.length() + 1) : new String(sum, 1, a.length());
    }
}

 504. 七进制数 - 力扣(LeetCode)

把十进制变成七进制:

这个我想得太繁琐了 

class Solution {
    public String convertToBase7(int num) {
        // 如果数字的绝对值小于7,直接返回数字的字符串表示
        if (Math.abs(num) < 7) {
            return Integer.toString(num);
        }

        // 判断数字的正负性
        boolean isPos = true;
        if (num < 0) {
            isPos = false;
        }
        num = Math.abs(num);

        // 计算数字的位数
        int temp = num;
        int count = 0;
        while (temp / 7 > 0) {
            count++;
            temp /= 7;
        }

        // 创建数组来存储7进制的每一位数字
        int[] res = new int[count + 1];
        for (int i = count; i >= 0; i--) {
            // 计算并存储当前位的数字
            res[count - i] = num / (int) Math.pow(7, i);
            num = num - (num / (int) Math.pow(7, i)) * (int) Math.pow(7, i);
        }

        // 使用StringBuilder拼接数组中的数字
        StringBuilder result = new StringBuilder();
        for (int digit : res) {
            result.append(digit);
        }

        // 返回结果,如果原始数字为负数,则加上负号
        return isPos ? result.toString() : "-" + result.toString();
    }
}

不如,取余的,不断更新num,然后翻转

class Solution {
    public String convertToBase7(int num) {
        if(num == 0) return "0";
        boolean isN = num < 0;
        if(isN) {
            num = -num;
        }
        StringBuilder sb = new StringBuilder();
        while(num > 0) {
            sb.append(num % 7);
            num /= 7;
        }
        if(isN) {
            sb.append("-");
        }
        return sb.reverse().toString();
    }
}

  

当然,也可以,抽象的哈哈哈哈(一个简单题越搞越多)

Java内置的 Integer.toString(int i, int radix) 方法,它可以将整数 i 转换为指定基数(radix)的字符串表示。在这里,基数是7,所以它直接实现了将整数转换为7进制字符串的功能。这是一种更简洁的实现方式,避免了手动计算每一位数字和使用循环的繁琐过程。

class Solution {
    public String convertToBase7(int num) {
        return Integer.toString(num, 7);
    }
}

405. 数字转换为十六进制数 - 力扣(LeetCode)

经过上一题启示,先用秀的方法

Java 内置的 Integer.toHexString(int num) 方法,该方法用于将整数转换为十六进制字符串。

class Solution {
    public String toHex(int num) {
        return Integer.toHexString(num);
    }
}

 

 

 使用了位运算和循环,从高位到低位依次取出每个四位二进制数的值,然后将其转换为对应的十六进制字符。最终,将这些字符拼接起来形成最终的十六进制字符串。

这个位运算很有意思:

class Solution {
    public String toHex(int num) {
        // 如果 num 为 0,直接返回 "0"
        if (num == 0) {
            return "0";
        }

        // 用于拼接十六进制字符串的 StringBuffer
        StringBuffer sb = new StringBuffer();

        // 从高位到低位遍历每个四位二进制数
        for (int i = 7; i >= 0; i--) {
            // 取出当前四位二进制数的值
            int val = (num >> (4 * i)) & 0xf;

            // 如果 StringBuffer 非空或者当前值大于 0,则将当前值添加到 StringBuffer 中
            if (sb.length() > 0 || val > 0) {
                // 将数字转换为十六进制字符
                char digit = val < 10 ? (char) ('0' + val) : (char) ('a' + val - 10);
                sb.append(digit);
            }
        }

        // 返回最终的十六进制字符串
        return sb.toString();
    }
}

妙:先将 temp 不断右移,直到变为 0,这样可以得到与 num 二进制表示相同位数的全1的数。然后通过异或操作,将 num 的每一位取反,得到最终的补数。

class Solution {
    public int findComplement(int num) {
        // 将 temp 初始化为 num,c 初始化为 0
        int temp = num, c = 0;

        // 循环右移 temp,直到 temp 变为 0
        while (temp > 0) {
            temp >>= 1;  // 右移一位
            c = (c << 1) + 1;  // 将 c 左移一位,并将最低位设置为 1
        }

        // 返回 num 与 c 的异或结果,即 num 的补数
        return num ^ c;
    }
}

通过迭代找到 num 的最高位的位置,然后构造一个掩码 mask,用于取反高位以下的所有位。最后,通过异或操作得到 num 的补数。这种方法避免了使用循环右移的方式,采用了更直接的方法。

其实这两种方法都是找异或的掩码,方法也差不多。

class Solution {
    public int findComplement(int num) {
        // 初始化 highbit 为 0
        int highbit = 0;

        // 遍历 1 到 30,找到 num 的最高位的位置
        for (int i = 1; i <= 30; ++i) {
            if (num >= 1 << i) {
                highbit = i;
            } else {
                break;
            }            
        }

        // 构造一个掩码 mask,用于取反高位以下的所有位
        int mask = highbit == 30 ? 0x7fffffff : (1 << (highbit + 1)) - 1;

        // 返回 num 与 mask 的异或结果,即 num 的补数
        return num ^ mask;
    }
}

 66. 加一 - 力扣(LeetCode)

 要处理一个特别的情况,全是九的时候,这里处理得很妙。

class Solution {
    public int[] plusOne(int[] digits) {
        for (int i = digits.length - 1; i >= 0; i--) {
			if (digits[i] != 9) {
                digits[i]++;
				return digits;
			} 
			digits[i] = 0;
		}
        //跳出for循环,说明数字全部是9
		int[] temp = new int[digits.length + 1];
		temp[0] = 1;
		return temp;
    }
}

 开摆的节奏哈哈哈

class Solution {
    public int largestPalindrome(int n) {
        switch (n) {
            case 1: return 9;
            case 2: return 987;
            case 3: return 123;
            case 4: return 597;
            case 5: return 677;
            case 6: return 1218;
            case 7: return 877;
            default: return 475;
        }
    }
}

枚举回文数的左半部分,然后构造右半部分,查找是否存在两个 n 位数的乘积,得到最大回文数。该方法在处理较小的 n 时效率较高,但可能对于较大的 n 不够高效。

class Solution {
    public int largestPalindrome(int n) {
        // 对于 n = 1,最大回文数为 9
        if (n == 1) {
            return 9;
        }
        
        // 计算 n 位数的上限值
        int upper = (int) Math.pow(10, n) - 1;
        int ans = 0;

        // 枚举回文数的左半部分
        for (int left = upper; ans == 0; --left) {
            long p = left;

            // 翻转左半部分到其自身末尾,构造回文数 p
            for (int x = left; x > 0; x /= 10) {
                p = p * 10 + x % 10;
            }

            // 枚举右半部分,查找是否存在两个 n 位数的乘积
            for (long x = upper; x * x >= p; --x) {
                if (p % x == 0) { // x 是 p 的因子
                    ans = (int) (p % 1337);
                    break;
                }
            }
        }
        return ans;
    }
}

564. 寻找最近的回文数 - 力扣(LeetCode)

class Solution {
    public String nearestPalindromic(String n) {
        
        Long input = Long.parseLong(n);
        int order = (int)Math.pow(10, n.length()/2);
        Long noChange = mirror(input);
        Long larger = mirror((input/order)*order + order + 1);
        Long smaller = mirror((input/order)*order - 1);
        
        if(noChange > input){
            larger = noChange < larger ? noChange : larger;
        }
        else if(noChange < input){
            smaller = noChange > smaller ? noChange : smaller;
        }
            
        return (input - smaller) <= (larger - input) ? String.valueOf(smaller) : String.valueOf(larger);
    }

    Long mirror(Long ans) {
        
        char[] arr = String.valueOf(ans).toCharArray();
        int i = 0;
        int j = arr.length-1;
        while(i < j){
            arr[j--] = arr[i++];
        }
        
        return Long.parseLong(String.valueOf(arr));
    }
}

class Solution {
    public int reverse(int x) {
        // int len=0,y=0,result=0,sub=1;
        // if(x<0) sub=-1;
        // x=Math.abs(x);
        // while(x>0){
        //     y=x%10;
        //     x=x/10;
        //     if(x>0){
        //         result=10*(y+result);
        //     }else{
        //         result=result+y;
        //     } 
        // }
        // //return sub*result>2^(31)-1 || sub*result<-2^(31) ? 0 : sub*result;
        // return sub * result > Math.pow(2, 31) - 1 || sub * result < -Math.pow(2, 31) ? 0 : sub * result;

        // long n = 0;
        // while(x != 0) {
        //     n = n*10 + x%10;
        //     x = x/10;
        // }
        // return (int)n==n? (int)n:0;

        int result = 0;
        while (x != 0) {
            //每次取末尾数字
            int temp = x % 10;
            //判断是否 大于 最大32位整数
           /* if (result > 214748364 || (result == 214748364 && temp > 7)) {
                return 0;
            }
            //判断是否 小于 最小32位整数
            if (result < -214748364 || (result == -214748364 && temp < -8)) {
                return 0;
            }*/
       /*     因为x本身会被int限制,
            当x为正数并且位数和Integer.MAX_VALUE的位数相等时首位最大只能为2,
            所以逆转后不会出现res = Integer.MAX_VALUE / 10 && tmp > 2的情况,
            自然也不需要判断res==214748364 && tmp>7了,反之负数情况也一样*/
            if (result > Integer.MAX_VALUE / 10 || result < Integer.MIN_VALUE / 10)  {
                return 0;
            }
            result = result * 10 + temp;
            x /= 10;

        }
        return result;
    }
}


总结

今天把数与位的第一个部分,进制转换做完了,感觉大部分都是简单题,仔细想想也能自己敲出来,需要注意的是一些回文数和进制的处理需要牢记。多敲!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/151686.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

二十、泛型(8)

本章概要 潜在的类型机制 pyhton 中的潜在类型C 中的潜在类型Go 中的潜在类型java 中的直接潜在类型 潜在类型机制 在本章的开头介绍过这样的思想&#xff0c;即要编写能够尽可能广泛地应用的代码。为了实现这一点&#xff0c;我们需要各种途径来放松对我们的代码将要作用的…

Leetcode周赛371补题(3 / 3)

目录 1、找出强数对的最大异或值 - 暴力 2、高访问员工 - 哈希表 模拟 3、最大化数组末位元素的最少操作次数 - 思维 贪心 1、找出强数对的最大异或值 - 暴力 找出强数对的最大异或值 I class Solution {public int maximumStrongPairXor(int[] a) {int na.length,max0;…

VS Code如何使用服务器的Python开发环境

❤️觉得内容不错的话&#xff0c;欢迎点赞收藏加关注&#x1f60a;&#x1f60a;&#x1f60a;&#xff0c;后续会继续输入更多优质内容❤️ &#x1f449;有问题欢迎大家加关注私戳或者评论&#xff08;包括但不限于NLP算法相关&#xff0c;linux学习相关&#xff0c;读研读博…

写作脑科学——屠龙的高效写作指南

ISBN: 978-7-115-59231-6 作者&#xff1a;杨滢&#xff08;屠龙的胭脂井&#xff09; 页数&#xff1a;201页 阅读时间&#xff1a;2023-09-09 推荐指数&#xff1a;★★★★★ 十分推荐这本书&#xff0c;写的非常简单易懂&#xff0c;里面有很多方法论和实用技巧&#xff0c…

X86 bios 中断大全

1、显示服务(Video Service——INT 10H) 00H —设置显示器模式 0CH —写图形象素 01H —设置光标形状 0DH —读图形象素 02H —设置光标位置 0EH —在Teletype模式下显示字符 03H —读取光标信息 0FH —读取显示器模式 04H —读取光笔位置 10H —颜色…

【LeetCode刷题-滑动窗口】--1658.将x减到0的最小操作数

1658.将x减到0的最小操作数 思路与算法&#xff1a; 根据题目描述&#xff0c;在每一次操作中&#xff0c;可以移除数组nums最左边和最右边的元素&#xff0c;因此&#xff0c;在所有的操作完成后&#xff0c;数组nums的一个前缀以及一个后缀被移除&#xff0c;并且它们的和恰…

CopyOnWriteArrayList 源码详解

目录 一. 前言 二. 源码详解 2.1. 类结构 2.2. 属性 2.3. 构造方法 2.4. add(E e) 2.5. add(int index, E element) 2.6. addIfAbsent() 方法 2.7. 获取元素() 方法 2.8. remove(int index) 2.9. size() 三. FAQ 3.1. 为什么CopyOnWriteArrayList没有size属性&…

架构师的成名之路

相信大家都对未来的职业发展有着憧憬和规划&#xff0c;要做架构师、要做技术总监、要做CTO。对于如何实现自己的职业规划也都信心满满&#xff0c;努力工作、好好学习、不断提升自己。 相信成为一名优秀的架构师是很多程序员的目标&#xff0c;架构师的工作包罗万象&#xff…

3.3 Windows驱动开发:内核MDL读写进程内存

MDL内存读写是一种通过创建MDL结构体来实现跨进程内存读写的方式。在Windows操作系统中&#xff0c;每个进程都有自己独立的虚拟地址空间&#xff0c;不同进程之间的内存空间是隔离的。因此&#xff0c;要在一个进程中读取或写入另一个进程的内存数据&#xff0c;需要先将目标进…

基于SSM的校园服务平台管理系统设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

C++初阶,详解类和对象(2)

详解类和对象&#xff08;2&#xff09; 一&#xff0c;前言二&#xff0c;构造函数2.1构造函数概念2.2构造函数特性 三&#xff0c;析构函数3.1析构函数概念3.2析构函数特性 一&#xff0c;前言 上一篇我们讲了类的大体框架&#xff0c;这篇内容我们要重点来说一说类的几个默…

【Vue】内置指令真的很常用!

内置指令 v-text v-text用于将一个变量的值渲染为元素的文本内容 注意v-text只能接受字符串类型的值,对于对象类型,会调用toString()方法 与插值表达式区别就是它会替换标签中的值&#xff0c;只显示它绑定的&#xff08;还是插值语法用的多~&#xff09; 语法 <元素 …

普源DS1052E固件升级【附所有升级固件及工具】

折腾了两天&#xff0c;总算是弄好了。 升级的目的是啥&#xff1f;DS1052E的带宽是50M&#xff0c;示波器的时基最小可以调到5ns。固件升级后示波器的时基最小可以调到2ns&#xff0c;理论上说明此时示波器的带宽是100M。 网上的方法能找到很多&#xff0c;我总结一下大概的流…

jeesite 按部门过滤数据权限(保姆级图文教程)

文章目录 前言一、数据库表添加机构字段二、修改实体3.修改服务层总结前言 在项目开发过程中,数据需要按照部门、公司进行权限过滤,本篇文章记录下如何修改按部门进行权限过滤的详细图文教程。 一、数据库表添加机构字段 要进行权限过滤的表中添加机构字段 二、修改实体 添…

Java 算法篇-链表的经典算法:根据值删除节点、删除倒数第 n 个节点

&#x1f525;博客主页&#xff1a; 小扳_-CSDN博客 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 文章目录 1.0 链表的创建 2.0 链表的经典算法 - 根据值来删除节点 2.1 根据值来删除节点 - 遍历链表来实现 2.2 根据值来删除节点 - 递归实现 3.0 链表的经典算法 - 删除倒数第 n…

Godot4.1 GDExtension 配置VisualStudio方法梳理以及快捷配置工具

写在最前 本篇教程基于之前教程&#xff0c;并且默认为Windows10&#xff0c;64位&#xff0c;Godot版本4.1.3如果遇到任何问题&#xff0c;欢迎及时提出&#xff0c;如果配置成功了请点个赞&#xff0c;球球啦。 之前教程 https://blog.csdn.net/qq_31805591/article/detai…

Java学习day12:static关键字,字符串声明,字符串常量池

声明&#xff1a;该专栏本人重新过一遍java知识点时候的笔记汇总&#xff0c;主要是每天的知识点题解&#xff0c;算是让自己巩固复习&#xff0c;也希望能给初学的朋友们一点帮助&#xff0c;大佬们不喜勿喷(抱拳了老铁&#xff01;) 往期回顾&#xff1a; Java学习day11&…

错误:CUDA error: device-side assert triggered CUDA kernel errors

对llama扩充中文词表后直接增量预训练&#xff0c;忘记设置--modules_to_save embed_tokens,lm_head,所以导致向量维度不一致&#xff0c;出现下面的错误。 1. 错误 2. 原因 出现这个错误的原因可能是因为维度或标签不一致。可以仔细排查一下。

【k8s集群搭建(二):基于虚拟机的linux的k8s集群搭建_超详细_可视化界面Dashboard安装_记录全过程踩坑记录及解决方法】

在 master 执行 # 根据 在线配置文件 创建资源 kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.3.1/aio/deploy/recommended.yaml设置访问端口 # 修改配置文件 找到 type&#xff0c;将 ClusterIP 改成 NodePort kubectl edit svc kubernetes-…

虾皮之家数据分析插件:知虾数据分析工具提升销量的利器

在当今的电商市场中&#xff0c;虾皮Shopee成为了许多商家的首选平台。然而&#xff0c;随着竞争的加剧&#xff0c;店铺运营变得越来越具有挑战性。如何提升销量&#xff0c;优化标题和图片&#xff0c;合理设置SKU&#xff0c;并准确跟踪店铺活动数据和竞品数据&#xff0c;已…
最新文章