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

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;//将字符串返回
    }
}

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

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

相关文章

基于java+SpringBoot+Vue的房屋租赁系统设计与实现

基于javaSpringBootVue的房屋租赁系统设计与实现 开发语言: Java 数据库: MySQL技术: Spring Boot JSP工具: IDEA/Eclipse、Navicat、Maven 系统展示 前台展示 房源浏览模块&#xff1a;展示可租赁的房源信息&#xff0c;用户可以根据条件筛选房源。 预约看房模块&#…

武汉星起航电子商务有限公司挂牌展示,为合作伙伴提供全方位支持

随着跨境电商领域市场竞争愈演愈烈&#xff0c;武汉星起航亚马逊一站式孵化平台悄然崭露头角。从2017年起&#xff0c;武汉星起航便立足亚马逊自营店铺&#xff0c;积累了丰富的实战运营经验。2020年正式成立后&#xff0c;公司以跨境电商为核心&#xff0c;凭借专业的运营团队…

STM32CubeIDE基础学习-定时器PWM实验

STM32CubeIDE基础学习-定时器PWM实验 文章目录 STM32CubeIDE基础学习-定时器PWM实验前言第1章 硬件介绍第2章 工程配置2.1 基础工程配置部分2.2 生成工程代码部分 第3章 代码编写3.1 查看PWM波3.2 设置单个比较值3.3 呼吸灯 第4章 实验现象总结 前言 在平时单片机开发时&#…

Midjourney艺术家分享|By Moebius

Moebius&#xff0c;本名让吉拉德&#xff08;Jean Giraud&#xff09;&#xff0c;是一位极具影响力的法国漫画家和插画师&#xff0c;以其独特的科幻和幻想风格而闻名于世。他的艺术作品不仅在漫画领域内受到高度评价&#xff0c;也为电影、时尚和广告等多个领域提供了灵感。…

MATLAB多级分组绘图及图例等细节处理 ; MATLAB画图横轴时间纵轴数值按照不同sensorCode分组画不同sensorCode的曲线

平时研究需要大量的绘图Excel有时候又臃肿且麻烦 尤其是当处理大量数据时可能会拖死Windows 示例代码及数据量展示 因为数据量是万级别的折线图也变成"柱状图"了, 不过还能看出大致趋势! 横轴是时间纵轴是传感器数值图例是传感器所在深度 % data readtable(C:\U…

Vue依赖注入,详细解析

Prop 逐级透传问题​ 通常情况下&#xff0c;当我们需要从父组件向子组件传递数据时&#xff0c;会使用 props。想象一下这样的结构&#xff1a;有一些多层级嵌套的组件&#xff0c;形成了一颗巨大的组件树&#xff0c;而某个深层的子组件需要一个较远的祖先组件中的部分数据。…

设计模式 --5观察者模式

观察者模式 观察者模式的优缺点 优点 当一个对象改变的时候 需要同时改变其他对象的相关动作的时候 &#xff0c;而且它不知道有多少具体的对象需要改变 应该考虑使用观察者模式 。观察者模式的工作就是解除耦合 让耦合双方都依赖与抽象 而不是具体 是的各自改变都不会影响另…

RedHat9中KVM虚拟机的配置与管理

KVM虚拟技术介绍 Linux的KVM&#xff08;Kernel-based Virtual Machine&#xff09;虚拟技术是一种基于Linux内核的虚拟化解决方案。它允许在单个物理服务器上创建和运行多个隔离的虚拟机&#xff0c;每个虚拟机都有自己的操作系统和应用程序&#xff0c;就像运行在独立的物理…

互联网轻量级框架整合之JavaEE基础II

编写本篇代码并实际执行之前请仔细阅读前一篇互联网轻量级框架整合之JavaEE基础I Servlet 在Servlet容器中&#xff0c;Servlet是最基础的组件&#xff0c;也可以把JSP当做Servlet&#xff0c;JSP的存在意义只在于方便编写动态页面&#xff0c;使Java语言能和HTML相互结合&…

【数据结构(一)】初识数据结构

❣博主主页: 33的博客❣ ▶文章专栏分类: Java从入门到精通◀ &#x1f69a;我的代码仓库: 33的代码仓库&#x1f69a; &#x1faf5;&#x1faf5;&#x1faf5;关注我带你学更多数据结构知识 目录 1.前言2.集合架构3.时间和空间复杂度3.1算法效率3.2时间复杂度3.2.1大O的渐进…

Docker 安装 | 部署MySQL 8.x 初始设置

1、准备工作 如果不想看前面的废话请直接右边目录跳到 运行容器 处 默认你已经有 docker 环境。 Windows 推荐 Docker Desktop &#xff08;下载地址&#xff09;并基于 WSL2 运行 Docker 环境 mac 推荐 Orbstack &#xff08;下载地址&#xff09;&#xff08;这个很节省资源&…

Codeforces Round 836 (Div. 2) D. Range = √Sum

题目 思路&#xff1a; #include <bits/stdc.h> using namespace std; #define int long long #define pb push_back #define fi first #define se second #define lson p << 1 #define rson p << 1 | 1 const int maxn 1e6 5, inf 1e18, maxm 4e4 5; c…

Codeforces Round 837 C. Hossam and Trainees 【欧拉筛加速大数素因子分解】

C. Hossam and Trainees 题意 给定一个长度为 n n n 的正整数数组 a a a&#xff0c;问是否能找到两个不同的位置 i , j ( i ≠ j ) i,j(i \neq j) i,j(ij)&#xff0c;使得 a i a_i ai​&#xff0c; a j a_j aj​ 不互质&#xff0c;即 g c d ( a i , a j ) > 1 gc…

算法设计与分析实验报告java实现(排序算法、三壶谜题、交替放置的碟子、带锁的门)

一、 实验目的 1&#xff0e;加深学生对算法设计方法的基本思想、基本步骤、基本方法的理解与掌握&#xff1b; 2&#xff0e;提高学生利用课堂所学知识解决实际问题的能力&#xff1b; 3&#xff0e;提高学生综合应用所学知识解决实际问题的能力。 二、实验任务 1、排序算法…

数据挖掘中的PCA和KMeans:Airbnb房源案例研究

目录 一、PCA简介 二、数据集概览 三、数据预处理步骤 四、PCA申请 五、KMeans 聚类 六、PCA成分分析 七、逆变换 八、质心分析 九、结论 十、深入探究 10.1 第 1 步&#xff1a;确定 PCA 组件的最佳数量 10.2 第 2 步&#xff1a;使用 9 个组件重做 PCA 10.3 解释 PCA 加载和特…

小林coding图解计算机网络|TCP篇06|如何理解TCP面向字节流协议、为什么UDP是面向报文的协议、如何解决TCP的粘包问题?

小林coding网站通道&#xff1a;入口 本篇文章摘抄应付面试的重点内容&#xff0c;详细内容还请移步&#xff1a;小林coding网站通道 文章目录 如何理解UDP 是面向报文的协议如何理解字节流如何解决粘包固定长度的消息 特殊字符作为边界自定义消息结构 如何理解UDP 是面向报文的…

Linux系统中的高级动态链接器技术

Linux系统中的高级动态链接器技术是当今软件开发中不可或缺的一部分。其中&#xff0c;ELF格式&#xff08;Executable and Linkable Format&#xff09;和动态链接库&#xff08;Dynamic Linking Library&#xff09;是两个核心概念。本文将详细介绍Linux系统中的这些技术&…

【数据结构】顺序表的实现——动态分配

&#x1f388;个人主页&#xff1a;豌豆射手^ &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f917;收录专栏&#xff1a;数据结构 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共同学习、交流进…

从C到C++过渡知识 中(为什么C++支持函数重载,而C不支持函数重载)

感谢大家的阅读&#xff0c;这篇文章我们接着了解C对于C的一些优化。 函数重载 了解C这个特殊用法之前&#xff0c;我们先考虑一个问题&#xff0c;如何交换两个整数。相信大家一定信手捏来&#xff0c;实参传地址而非变量&#xff0c;于是可以写出如下函数。 void Swap(int*…

轻薄本没有独立显卡如何运行stable diffusion

众所周知&#xff0c;Stable Diffusion WebUI 使用 GPU 模式运行。 一&#xff1a;检查自己显卡 打开任务管理器或者winR 输入dxdiag 查看自己显卡状态 很明显一般轻薄本只会带有集显&#xff0c;不能满足stable diffusion要求所以我们可以使用cup来运行stable diffusion 在…