java数据结构与算法刷题-----LeetCode504. 七进制数

news2025/4/28 3:10:55
java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完):https://blog.csdn.net/grd_java/article/details/123063846

文章目录

    • 1. 倒退+迭代(除基取余法)
    • 2. 省略掉反转操作
    • 3. 系统提供API的自实现

在这里插入图片描述

当使用经典算法除基取余法后,发现效率最快的是调用的系统提供的API,所以我研究了底层代码,会在方法二给出。法一依然是经典的除基取余法。
在这里插入图片描述

1. 倒退+迭代(除基取余法)

解题思路:时间复杂度O( l o g 2 ∣ n u m ∣ log_2|num| log2num),空间复杂度O( l o g 2 ∣ n u m ∣ log_2|num| log2num)
  1. 如果是0,则不需要转换,直接返回0
  2. 创建一个negative的boolean型变量,如果num是负数,就设置为true
  3. 然后num取绝对值,我们只对正数操作
  4. 我们通过字符数组,来保存除基取余的结果
  5. 每次都将取余7的结果保存到数组中,然后num变为除以7的商。就是除基取余的原理。直到num被除完。
  6. 最后如果negative是true,就添加一个负号
  7. 因为除基取余法,需要从后往前读取结果,所以需要我们将数组反转后返回
代码

在这里插入图片描述

class Solution {
    public String convertToBase7(int num) {
        if (num == 0) return "0";//如果是0,则不需要转换,直接返回0
        boolean negative = num < 0;//是否是负数
        num = Math.abs(num);//保证我们操作的是正数
        StringBuffer digits = new StringBuffer();//保存答案
        while (num > 0) {//除基取余
            digits.append(num % 7);//取余
            num /= 7;//除基
        }
        if (negative) {//是负数就加负号
            digits.append('-');
        }
        return digits.reverse().toString();//反转字符串返回,因为除基取余法需要从后往前取答案
    }
}

2. 省略掉反转操作

解题思路:时间复杂度O( l o g 2 ∣ n u m ∣ log_2|num| log2num),空间复杂度O( l o g 2 ∣ n u m ∣ log_2|num| log2num)
  1. 法一中,我们最后需要将整个结果进行反转操作,因为这是除基取余的特性
  2. 但是如果我们从一开始就反着添加结果,最后不就不需要反转了吗?
代码

在这里插入图片描述

class Solution {
    public String convertToBase7(int num) {
        char[] toChar = new char[33];//字符数组
        boolean negative = (num<0);//是否是负数
        int charPosition = 32;//字符数组的插入下标,从后往前插入
        if(!negative)num = -num;//如果是正数,也改为负数,我们只对负数进行操作
        while(num <= -7){//只要还<-7,就继续除基取余
            //因为num是负数,取余后还需要取负(-(num % 7))。最后需要将其转换为字符(char)('0'+(-(num % 7)))
            toChar[charPosition--] = (char)('0'+(-(num % 7)));
            num = num/7;//除基
        }
        toChar[charPosition] = (char) ('0'+(-num));//将最后剩下的>-7的余数添加
        if(negative)toChar[--charPosition] = '-';//如果是负数,额外添加一个负号
        //charPosition是目前转换后的7进制起始下标,(33 - charPosition)为转换后的数字的长度,charPosition + (33 - charPosition) 为末尾下标。
        //Arrays.copyOfRange(buf, charPosition, charPosition+(33 - charPosition))将其截取出来,然后生成字符串s
        String s = new String(Arrays.copyOfRange(toChar, charPosition, charPosition+(33 - charPosition)));
        return s;
    }
}

3. 系统提供API的自实现

解题思路:时间复杂度O( l o g 2 ∣ n u m ∣ log_2|num| log2num),空间复杂度O( l o g 2 ∣ n u m ∣ log_2|num| log2num)
  1. Java提供的API是通过字节数组实现,效率更高
  2. 我们也通过字节数组将其实现. 而其实现居然和我们法二中大差不差,而且也是省略了反转操作。居然和我优化后的思路是一样的。
代码:效率会比法二高很多,但是官方测试用例太小,已经无法体现出差距了,如果数据量够大,一定是这个方法的字节数组更快。

在这里插入图片描述

class Solution {
    static final char[] digits = {
            '0' , '1' , '2' , '3' , '4' , '5' ,
            '6' , '7' , '8' , '9' , 'a' , 'b' ,
            'c' , 'd' , 'e' , 'f' , 'g' , 'h' ,
            'i' , 'j' , 'k' , 'l' , 'm' , 'n' ,
            'o' , 'p' , 'q' , 'r' , 's' , 't' ,
            'u' , 'v' , 'w' , 'x' , 'y' , 'z'
    };//对应表,我们想要用int的0得到char的'0'。而通过这个会有更好的效率,另外如果是16进制,10对应a,11对应b....
    //逢七进一
    public String convertToBase7(int num) {
        byte[] buf = new byte[33];//字节数组,速度更快
        boolean negative = (num<0);//如果是负数,就设置为true
        int charPosition = 32;//下标,从后往前
        if(!negative)num = -num;//我们只对负数操作,如果num不是负数,就改为负数
        while(num <= -7){//只要还小于等于-7,就继续除基取余
            //num%7会得到本次的余数,而它是个负数,所以我们进行-(num % 7)会得到正数,
            //然后访问digits[-(num % 7)]得到对应的char类型字符。然后通过(byte)转换为ASCII二进制码
            buf[charPosition--] = (byte)digits[-(num % 7)];//将其放到字节数组中charPosition位置
            num = num/7;//去除本次取得的余数,进行下一次除基取余
        }
        buf[charPosition] = (byte) digits[-num];//将最后剩余的无法被7整除的num放入字节数组中
        if(negative)buf[--charPosition] = '-';//如果是负数,额外放入一个负号
        //charPosition是目前转换后的7进制起始下标,(33 - charPosition)为转换后的数字的长度
        //charPosition + (33 - charPosition) 为末尾下标。
        //Arrays.copyOfRange(buf, charPosition, charPosition+(33 - charPosition))将其截取出来,然后生成字符串s
        String s = new String(Arrays.copyOfRange(buf, charPosition, charPosition+(33 - charPosition)));
        return s;//将字符串返回
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【JavaEE初阶系列】——文件操作 IO 之 文件系统操作

目录 &#x1f4dd;认识文件 &#x1f6a9;树型结构组织 和 目录 &#x1f388;绝对路径和相对路径 &#x1f6a9;文件类型 &#x1f4dd;文件系统操作 &#x1f388;File 概述 &#x1f388;File类的使用 1. 绝对路径 vs 相对路径 2. 路径分隔符 3. 静态成员变量 4…

小明记账簿-记账工具

今天不了技术&#xff0c;聊一下工具&#xff0c;最近耗费无数个日日夜夜&#xff0c;做了一个记账小程序&#xff0c;感觉很实用&#xff0c;简单方便&#xff0c;希望帮助那些需要帮助的人。 想轻松管理个人财务吗&#xff1f;试试小明记账簿吧&#xff01;它是一款便捷&…

篮桥杯刷题第n天(dp更新)

最长上升子序列 输入&#xff1a; 10 1 4 5 1 4 1 9 1 9 输出&#xff1a; 4 算法思想&#xff1a;记录每个数为结尾的最长子序列长度&#xff0c;作为dp数组。 eg&#xff1a;&#xff08;这个是以每个位置开头的记录最长的来穷举但核心仍为上述的算法思想&#xff09; …

vue快速入门(一)vue的导入方法

注释很详细&#xff0c;直接上代码 新增内容 下载js代码导入实例数据绑定显示 源码 index.html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-widt…

【解读Kubernetes架构】全面指南,带你掌握Kubernetes的设计原理与构成!

了解 Kubernetes 架构&#xff1a;综合指南 前言一、什么是 Kubernetes 架构&#xff1f;1.1、控制平面1.2、工作节点 二、Kubernetes 控制平面组件2.1、kube-api服务器2.2、etcd2.3、kube-scheduler2.4、Kube 控制器管理器2.5、云控制器管理器 &#xff08;CCM&#xff09; 三…

【HarmonyOS】ArkUI - 动画

利用属性动画、显示动画、组件转场动画实现组件动画效果。 一、属性动画 属性动画是通过设置组件的 animation 属性来给组件添加动画&#xff0c;当组件的 width、height、Opacity、backgroundColor、scale、rotate、translate 等属性变更时&#xff0c;可以实现渐变过渡效果。…

有人用GPT来做日内交易,居然赚钱了!但是……

在我们还在烦恼会不会被AI替代时&#xff0c;已经有人在教ChatGPT去炒股票了。 在近年ChatGPT火速出圈后&#xff0c;围绕AI能取代什么职业的讨论持续受到大众关注。 从事客服、编程、法律合规以及内容创作等行业人员最早感受到这股AI带来的寒意。 那ChatGPT能不能替代交易员…

Web APIs简介 Dom

JS的组成 API API 是一些预先定义的函数&#xff0c;目的是提供应用程序与开发人员基于软件或硬件得以访问一组例程的能力&#xff0c;而又无需访问源码&#xff0c;或理解内部工作机制的细节 简单理解&#xff1a;API是给程序员提供的一种工具&#xff0c;以便能更轻松的实现…

[计算机知识] 各种小问题思考

哈希算法以及哈希冲突 哈希算法&#xff1a;将任何长度的输入通过散列函数转换成固定长度的字符串 哈希冲突&#xff1a;不同的输入经过哈希函数处理后得到相同的哈希值 因为哈希函数的输出域是有限的 解决哈希冲突&#xff1a; 1. 开放寻址&#xff1a;产生哈希冲突后&…

刷题之Leetcode704题(超级详细)

704. 二分查找 力扣题目链接(opens new window)https://leetcode.cn/problems/binary-search/ 给定一个 n 个元素有序的&#xff08;升序&#xff09;整型数组 nums 和一个目标值 target &#xff0c;写一个函数搜索 nums 中的 target&#xff0c;如果目标值存在返回下标&am…

【Apache Doris】周FAQ集锦:第 1 期

【Apache Doris】周FAQ集锦&#xff1a;第 1 期 SQL问题数据操作问题运维常见问题其它问题关于社区 欢迎查阅本周的 Apache Doris 社区 FAQ 栏目&#xff01; 在这个栏目中&#xff0c;每周将筛选社区反馈的热门问题和话题&#xff0c;重点回答并进行深入探讨。旨在为广大用户和…

【Java设计模式】序:设计模式总体概述

目录 什么是设计模式设计模式的分类1 创建型模式1.1. 单例&#xff08;Singleton&#xff09;1.2 原型&#xff08;Prototype&#xff09;1.3 工厂方法&#xff08;FactoryMethod&#xff09;1.4 抽象工厂&#xff08;AbstractFactory&#xff09;1.5 建造者&#xff08;Builde…

<网络安全>《71 微课堂<常见的国家级APT组织介绍>》

1 简介 国家级APT&#xff08;Advanced Persistent Threat&#xff0c;高级持续性威胁&#xff09;组织是有国家背景支持的顶尖黑客团伙&#xff0c;专注于针对特定目标进行长期的持续性网络攻击。 2 十大APT 2.1 NSA 美国国家安全局&#xff08;National Security Agency&a…

Redis面试题28道

1、什么是类加载器&#xff0c;类加载器有哪些&#xff1f; 1、什么是类加载器&#xff1f; 类加载器负责加载所有的类&#xff0c;其为所有被载入内存的类生成一个 java.lang.Class 实例对象。 2、类加载器有哪些&#xff1f; JVM 有三种类加载器&#xff1a; &#xff08…

基于GaN的半导体光学放大器SOA

摘要 基于GaN的材料可覆盖很宽的光谱范围&#xff0c;以紫外、紫、蓝、绿和红波发射的激光二极管已经商业化。基于GaN的半导体光学放大器&#xff08;SOA&#xff09;具有提高激光二极管输出功率的能力&#xff0c;因此SOA将有很多潜在应用。未来需要利用短波、超快脉冲特性的…

GD32F470_ADS1115 超小型 16位 模数转换器 ADC 4通道模块移植

2.9 ADS1115多路模数转换器 ADS1115 器件是兼容 IIC 的 16 位高精度低功耗模数转换器 (ADC)&#xff0c;采用超小型无引线 X2QFN-10 封装和 VSSOP-10 封装。ADS111x 器件采用了低漂移电压基准和振荡器。ADS1114 和 ADS1115 还采用可编程增益放大器(PGA)和数字比较器。这些特性加…

kali报错Unable to connect to remote host: No route to host,如何解决??

&#x1f3c6;本文收录于「Bug调优」专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收藏&&…

《搜广推算法指南》(2024版) 重磅发布!

节前&#xff0c;我们星球组织了一场算法岗技术&面试讨论会&#xff0c;邀请了一些互联网大厂朋友、参加社招和校招面试的同学&#xff0c;针对算法岗技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何准备、面试常考点分享等热门话题进行了深入的讨论。 结合…

全自动封箱机的工作原理:科技与效率的完美结合

随着科技的不断发展&#xff0c;越来越多的自动化设备走进了我们的日常生活和工业生产中。其中&#xff0c;全自动封箱机作为物流包装领域的重要一环&#xff0c;凭借其高效、精准的工作性能&#xff0c;正逐渐成为提升生产效率、降低劳动成本的得力助手。星派就来与大家深入探…

python调用java中的jar

一、基于IDEA生成可执行jar包 1、编写class的代码&#xff0c;注意一定要有main()方法才可以生成jar包&#xff0c;main()方法可以没有内容。例如下Java 代码&#xff1a; package Project;public class Demo {public static void main(String[] args){Demo t2 new Demo();S…