Leetcode 504.七进制数

news2024/11/25 14:50:15

给定一个整数 num,将其转化为 7 进制,并以字符串形式输出。

示例 1:

输入: num = 100
输出: "202"

示例 2:

输入: num = -7
输出: "-10"

我的答案:

一、信息

1.目的实现十进制向其他进制的转换。

2.原理:公式

3.一段运算过程

4.根据后面的一段话不难看出根据作者的意思就是用栈的数据结构来存储每次辗转相除后的余数然后输出

二、分析

问题出现

问题1:如何实现栈的构造。

问题2:然后如何把余数压入栈

问题3:如何把余数放出栈

我的答案:

为了实现这个功能,我们可以使用栈数据结构来帮助我们进行进制转换。以下是我们的思考和分析过程:

  1. 检查特殊情况: 如果 num 是 0, 我们可以直接返回 "0"。
  2. 处理符号: 如果 num 是负数,我们记下这个信息,并将 num 转化为正数进行处理。
  3. 数字转换: 不断将 num 除以 7,并将余数放入栈中,直到 num 为 0。
  4. 构建结果字符串: 然后我们可以从栈中取出元素(这将给我们一个反向的 7 进制表示)并构建结果字符串。如果最初的 num 是负数,我们在结果字符串前加上负号。

流程图: 

源代码:

C语言:

#include <stdio.h>
#include <stdlib.h>

char* convertToBase7(int num) {
    if (num == 0) return "0";

    char *result = (char *)malloc(12); // sufficient size to store the result as string
    int index = 0;
    int is_negative = 0;
    if (num < 0) {
        is_negative = 1;
        num = -num;
    }

    int stack[10]; // stack to hold the digits
    int top = -1;

    while (num > 0) {
        stack[++top] = num % 7;
        num /= 7;
    }

    if (is_negative) {
        result[index++] = '-';
    }

    while (top >= 0) {
        result[index++] = '0' + stack[top--];
    }

    result[index] = '\0';

    return result;
}

int main() {
    printf("%s\n", convertToBase7(100)); // Output: "202"
    printf("%s\n", convertToBase7(-7));  // Output: "-10"
    return 0;
}

C++:

#include <iostream>
#include <stack>
#include <string>

std::string convertToBase7(int num) {
    if (num == 0) return "0";

    std::stack<int> s;
    std::string result;
    bool is_negative = false;

    if (num < 0) {
        is_negative = true;
        num = -num;
    }

    while (num > 0) {
        s.push(num % 7);
        num /= 7;
    }

    if (is_negative) {
        result += '-';
    }

    while (!s.empty()) {
        result += '0' + s.top();
        s.pop();
    }

    return result;
}

int main() {
    std::cout << convertToBase7(100) << std::endl; // Output: "202"
    std::cout << convertToBase7(-7) << std::endl;  // Output: "-10"
    return 0;
}

 JAVA:

import java.util.Stack;

public class Main {
    public static String convertToBase7(int num) {
        if (num == 0) return "0";

        Stack<Integer> stack = new Stack<>();
        StringBuilder result = new StringBuilder();
        boolean isNegative = false;

        if (num < 0) {
            isNegative = true;
            num = -num;
        }

        while (num > 0) {
            stack.push(num % 7);
            num /= 7;
        }

        if (isNegative) {
            result.append('-');
        }

        while (!stack.isEmpty()) {
            result.append(stack.pop());
        }

        return result.toString();
    }

    public static void main(String[] args) {
        System.out.println(convertToBase7(100)); // Output: "202"
        System.out.println(convertToBase7(-7));  // Output: "-10"
    }
}

三者的区别: 

虽然这三种实现都使用了栈数据结构来实现整数到7进制的转换,但它们之间还是存在一些差别:

1. **语言特性和语法**:
   - **C**:需要手动管理内存分配和释放,并且使用字符数组来构建结果字符串。
   - **C++**:可以利用 STL 中的栈和字符串,它们有助于简化代码和减少错误。
   - **Java**:利用了 Java 的 Stack 类和 StringBuilder 类,Java 为内存管理提供了自动垃圾回收。

2. **内存分配**:
   - **C**:在堆上分配内存来存储结果字符串,并在最后添加了空字符('\0')来标记字符串的结束。
   - **C++**:使用了 std::string 类,它内部管理内存分配和释放。
   - **Java**:StringBuilder 类用来动态构建字符串,Java 虚拟机负责管理内存。

3. **错误处理和特殊情况的处理**:
   - 所有三种实现都检查了 `num` 是否为0的特殊情况,并对负数进行了处理。

4. **栈的使用**:
   - 在所有的实现中,我们都使用栈来存储7进制的数字,这样可以确保在构建结果字符串时,我们能够从最高位开始(因为栈是先入后出的数据结构)。

5. **代码的可读性和维护性**:
   - **C**:需要更多的代码来管理内存和数组索引。
   - **C++**:由于使用了 STL,代码比 C 更简洁和易读。
   - **Java**:由于使用了类和对象,代码是高度结构化和模块化的,易于读取和维护。

综上所述,虽然核心逻辑是相似的,但由于语言的特性和差异,每种实现都有其独特的方面和处理方式。

解决问题:

英雄师傅的答案:

英雄师傅的思路:

源代码:

char *convertToBase7(int num) {
    char *ret = (char *)malloc(sizeof(char) * 100); // 分配一个足够大的字符数组来存储结果
    int size = 0; // 用于跟踪结果字符串的当前长度
    int stk[50], top = 0; // 用于将数字的7进制表示反向存储在栈中

    if (num < 0) { // 如果输入的数字为负数
        num = -num; // 取其绝对值
        ret[size++] = '-'; // 在结果字符串中加入负号
    }

    if (num == 0) { // 如果输入的数字为0
        ret[size++] = '0'; // 直接将字符'0'存储在结果字符串中
    }

    while (num) { // 将数字的7进制表示逆序存储在栈中
        stk[top++] = num % 7; // 取余数并存储在栈中
        num /= 7; // 将数字除以7,以进行下一位的计算
    }

    while (top) { // 从栈中取出数字的7进制表示,并存储在结果字符串中
        ret[size++] = stk[--top] + '0'; // 逆序取出并转换为字符
    }

    ret[size] = '\0'; // 在结果字符串的最后添加终止符,以表示字符串的结束

    return ret; // 返回存储7进制表示的字符串
}

Leetcode题解:

C语言: 

char * convertToBase7(int num){
    if (num == 0) {
        return "0";
    }
    bool negative = num < 0;
    num = abs(num);
    char * digits = (char *)malloc(sizeof(char) * 32);
    int pos = 0;
    while (num > 0) {
        digits[pos++] = num % 7 + '0';
        num /= 7;
    }
    if (negative) {
        digits[pos++] = '-';
    }
    for (int l = 0, r = pos - 1; l < r; l++, r--) {
        char c = digits[l];
        digits[l] = digits[r];
        digits[r] = c;
    }
    digits[pos] = '\0';
    return digits;
}

C++:

class Solution {
public:
    string convertToBase7(int num) {
        if (num == 0) {
            return "0";
        }
        bool negative = num < 0;
        num = abs(num);
        string digits;
        while (num > 0) {
            digits.push_back(num % 7 + '0');
            num /= 7;
        }
        if (negative) {
            digits.push_back('-');
        }
        reverse(digits.begin(), digits.end());
        return digits;
    }
};

JAVA:

class Solution {
    public String convertToBase7(int num) {
        if (num == 0) {
            return "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();
    }
}

总结:

两种方式的比较:

使用栈存储和Leetcode提供的方法(字符串拼接+反转)在实现上有一些区别。让我们逐一探讨这两种方法的优缺点:

### 1. 使用栈存储方法

#### 优点:
1. **自然的顺序**:栈是一种后进先出(LIFO)的数据结构,它可以自然地按照从高位到低位的顺序存储七进制的数字。
2. **无需字符串反转**:由于栈的性质,我们可以按照高位到低位的顺序提取数字,避免了字符串反转这一步骤。
3. **代码可读性**:使用栈可以使代码具有更好的结构和可读性,特别是对于初学者来说,可以更清晰地展示算法的逻辑。

#### 缺点:
1. **额外的空间**:使用栈意味着我们需要额外的空间来存储数据。
2. **可能的额外时间开销**:栈操作(压栈和弹栈)可能会增加一些时间开销。

### 2. Leetcode提供的方法(字符串拼接+反转)

#### 优点:
1. **空间效率**:直接使用字符串进行操作,避免了使用额外数据结构导致的空间开销。
2. **简洁性**:代码相对简洁,尤其是在处理字符串拼接和反转的编程语言中。

#### 缺点:
1. **需要字符串反转**:由于从低位开始构建结果字符串,因此需要在最后执行一次字符串反转操作,增加了一些时间复杂度。
2. **代码可读性**:虽然代码较为简洁,但对于初学者来说,理解代码的逻辑可能需要更多时间。

### 总结:
- **栈存储方法**更适用于想要清晰展示算法逻辑的场合,它可以更自然地表达算法中的步骤,但可能会带来一些额外的时间和空间开销。
- **Leetcode的方法**则更为简洁和高效,尤其是在字符串操作相对便捷的编程语言中
但可能需要更多的时间来理解和分析代码的逻辑。

从这道题目中我们能学到什么?

这道题目可以帮助我们学到以下几点:

1. **基本数学知识**:它强调了我们对数字进制转换的理解,特别是如何从十进制转换为其他进制。这是计算机科学中一个非常基本但重要的概念。

2. **算法设计和实现**:通过设计算法来解决这个问题,我们可以学习如何将抽象的数学问题转化为具体的算法和代码实现。

3. **条件处理**:本题目涉及正数和负数的处理,这能帮助我们理解如何在算法中处理不同的条件和边界情况。

4. **数据结构的应用**:如果我们选择用栈来解决这个问题,我们可以学到如何在实际问题中使用栈这一数据结构。同时,通过比较栈和字符串拼接方法,我们可以学习如何根据特定问题选择合适的数据结构。

5. **代码优化**:通过比较不同的解决方案(如使用栈与直接使用字符串),我们可以学习如何分析和比较不同方法的时间和空间复杂度,从而进行代码优化。

6. **问题分析和解决策略**:我们可以学习如何分析问题,确定解决策略,然后逐步实现。例如,在这个问题中,我们首先需要分析如何从数学的角度解决问题,然后再将解决方案转换为代码。

7. **代码的可读性和简洁性**:我们可以学习如何编写简洁而可读的代码,以便于其他人(或未来的我们)理解和维护代码。

8. **实际应用**:在计算机科学中,进制转换是一个常见的操作。通过学习如何实现这样的转换,我们可以更好地理解和应用这一概念于实际情境中。

总的来说,这道题目可以作为一个很好的练习来提升我们的编程技能和算法设计能力。

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

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

相关文章

openGauss学习笔记-67 openGauss 数据库管理-创建和管理普通表-创建表

文章目录 openGauss学习笔记-67 openGauss 数据库管理-创建和管理普通表-创建表67.1 背景信息67.2 创建表 openGauss学习笔记-67 openGauss 数据库管理-创建和管理普通表-创建表 67.1 背景信息 表是建立在数据库中的&#xff0c;在不同的数据库中可以存放相同的表。甚至可以通…

Redis模块二:缓存分类 + Redis模块三:常见缓存(应用)

缓存大致可以分为两大类&#xff1a;1&#xff09;本地缓存 2&#xff09;分布式缓存 目录 本地缓存 分布式缓存 常见缓存的使用 本地缓存&#xff1a;Spring Cache 分布式缓存&#xff1a;Redis 本地缓存 本地缓存也叫单机缓存&#xff0c;也就是说可以应⽤在单机环…

Spring Boot 动态加载jar文件

Spring Boot 动态加载jar文件 接口实现&#xff1a; package org.bc.device;public interface IDeviceHandler {String start();String stop(); }实现类&#xff1a; package org.bc.device; public class MqttDevice implements IDeviceHandler{ Override public String s…

深度学习:循环神经网络RNN及LSTM

深度学习&#xff1a;循环神经网络RNN及LSTM 循环神经网络RNN原理代码 长短期记忆网络LSTM原理遗忘门记忆门输出门 代码 循环神经网络RNN 原理 对于传统的神经网络&#xff0c;它的信号流从输入层到输出层依次流过&#xff0c;同一层级的神经元之间&#xff0c;信号是不会相互…

双目立体视觉

#理想模型图 其中&#xff1a; b 为基线&#xff0c;即两个相机原点之间的距离 &#xff1b; fl和fr 分别为左右相机的焦距&#xff0c;理想的双目相机flfrf &#xff1b; cl和cr 分别为左右相机的光心&#xff0c;理想的双目相机clcr &#xff1b; xl和xr 分别为空间中的一点…

mac连不上5gwifi怎么解决 macbook无法连接5g wifi

MBP突然连不上5G Wifi&#xff0c;但是用Wifi却可以&#xff0c;用手机、平板使用5G WIFI一切正常&#xff0c;是什么问题呢&#xff1f;重启路由器、重启电脑、路由器刷机、路由器恢复出厂设置&#xff0c;一番折腾下来&#xff0c;费时又费力&#xff0c;终于MacOS可以搜索到…

【面试经典150 | 数组】删除有序数组中的重复项

文章目录 写在前面Tag题目来源题目解读解题思路方法一&#xff1a;双指针 写在最后 写在前面 本专栏专注于分析与讲解【面试经典150】算法&#xff0c;两到三天更新一篇文章&#xff0c;欢迎催更…… 专栏内容以分析题目为主&#xff0c;并附带一些对于本题涉及到的数据结构等内…

一个Qt鼠标透传场景与事件过滤器的用法

一个Qt鼠标透传场景与事件过滤器的用法 最近工作中遇到一个开发场景&#xff0c;将一个QWidget控件&#xff08;称为控件A&#xff09;放入QScrollArea&#xff0c;该控件A重写了QWidget::wheelEvent&#xff0c;根据鼠标滚轮事件缩放内部的绘制视图。当控件过大时&#xff0c…

软件工程评级B-,有大量调剂名额。北京联合大学考情分析

北京联合大学(B-) 考研难度&#xff08;☆&#xff09; 内容&#xff1a;23考情概况&#xff08;拟录取和复试分析&#xff09;、院校概况、23专业目录、23复试详情、各专业考情分析、各科目考情分析。 正文1239字&#xff0c;预计阅读&#xff1a;3分钟 2023考情概况 北京…

FreeMarker详细介绍

FreeMarker详细介绍 FreeMarker FreeMarker概述 FreeMarker概念 FreeMarker 是一款 模板引擎&#xff1a; 即一种基于模板和要改变的数据&#xff0c; 并用来生成输出文本(HTML网页&#xff0c;电子邮件&#xff0c;配置文件&#xff0c;源代码等)的通用工具。 是一个Java类库…

nodejs实现websocket服务端和客户端

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

MySQL长文本字段的选取

某个字段需要存储 长文本类型的数据,长度可变,范围不清. varchar最多能存储多大长度呢? 何种情况下用text更好? 以下内容就为探究这个问题: <1>.先将content字段设为varchar(255),则此字段只能最多存储255个字符数 package mainimport "fmt"func main() { va…

2023年会展行业研究报告

第一章 行业概况 1.1 定义 会展行业是一个多元化和复杂的领域&#xff0c;涵盖了许多不同的活动和功能。一般来说&#xff0c;会展业是指在一定的区域空间内&#xff0c;许多人聚集在一起形成的定期或者不定期&#xff0c;制度或者非制度&#xff0c;传递和交流信息的群众性的…

Visual Studio运行Python程序(超级详细)

Visual Studio Code&#xff0c;简称 VS Code&#xff0c;是由微软公司开发的 IDE 工具。与微软其他 IDE&#xff08;如 Visual Studio&#xff09;不同的是&#xff0c;Visual Studio Code 是跨平台的&#xff0c;可以安装在 Windows、Linux 和 macOS平台上运行。 不仅如此&am…

UMA 2 - 创建自己的UMA模型⭐一.配置Blender环境

文章目录 🟥 下载 simple_renaming_panel🟧 Blender安装插件🟨 启用插件并保持自动更新🟩 打开插件视图🟥 下载 simple_renaming_panel UMA需要指定的人物骨骼名称,因此我们用该Blender插件快捷重命名. 下载链接: https://github.com/Weisl/simple_renaming_panel �…

阅读类APP广告变现的商业化发展方向

免费阅读类 APP 对广告的依赖程度较高。因此&#xff0c;如何实现流量精细化运营以最大化流量价值&#xff0c;是流量主面临的关键课题和难点&#xff1b;与此同时&#xff0c;免费阅读 APP 的 PV 量极大&#xff0c;但 UV、DAU 量级相对较小&#xff0c;因此&#xff0c;如何开…

python 学习笔记(6)—— Flask 、MySql

目录 Flask 1、起步 2、渲染项目的首页 3、处理无参数的 GET 请求 4、处理有 query 参数的 GET 请求 6、处理 params 参数的 get 请求 6、处理 application/json 类型请求体的 POST 请求 7、根据参数渲染模板页面 8、上传文件 数据库操作&#xff08;mysql&#xff0…

Jenkins结合gitlab自动化持续集成

最近在公司有负责搭建自动化测试环境&#xff0c;自动化脚本写好后&#xff0c;毋庸置疑是需要将自动化脚本进行持续集成测试&#xff0c;能够根据企业的定制化需求&#xff0c;通过Jenkins触发执行构建任务&#xff0c;定时执行自动化脚本等&#xff0c;今天就给大家介绍一下J…

可视化大屏设计模板 | 主题皮肤(报表UI设计)

下载使用可视化大屏设计模板&#xff0c;减少重复性操作&#xff0c;提高报表制作效率的同时也确保了报表风格一致&#xff0c;凸显关键数据信息。 软件&#xff1a;奥威BI系统&#xff0c;又称奥威BI数据可视化工具 所属功能板块&#xff1a;主题皮肤上传下载&#xff08;数…

【实践篇】redis管道pipeline使用详解

文章目录 0. 前言什么场景下使用redis管道特性 1.原理1.1 redis管道特性的处理机制 使用redis管道优化示例3. springboot使用redis管道示例4. 参考资料5. 源码地址6. Redis从入门到精通系列文章 0. 前言 Redis管道&#xff08;Pipeline&#xff09;是一种批量执行Redis命令的机…