【2025刷题笔记】- N进制减法

刷题笔记合集🔗

N进制减法

问题描述

小基期望你实现一个基于字符串的N进制的减法。

需要对输入的两个字符串按照给定的N进制进行减法操作,输出正负符号和表示结果的字符串。

输入格式

输入有三个参数:

. 第一个参数是整数形式的进制N值,N值范围为大于等于 、小于等于

. 第二个参数为被减数字符串。

. 第三个参数为减数字符串。

有效的字符包括0-9以及小写字母a-z,字符串有效字符个数最大为100个字符,另外还有结尾的\0。

限制:

输入的被减数和减数,除了单独的0以外,不能是以0开头的字符串。

如果输入有异常或计算过程中有异常,此时应当输出-1表示错误。

输出格式

输出有2个。

其一为减法计算的结果,-1表示出错,0表示结果为整数,1表示结果为负数。

其二为表示结果的字符串。

样例输入

2 11 1
8 07 1

样例输出

0 10
-1
样例 解释说明
样例1 按二进制计算 11 -1 ,计算正常,0表示符号为正数,结果为10
样例2 按8进制,检查到减数不符合非0前导的要求,返回结果为-1,没有其他结果内容。

数据范围

  • 字符串长度最大为100个字符

题解

这道题目要求实现一个N进制的减法运算,并且对输入有多种异常情况需要处理。

解题思路很直接:将N进制数转换成十进制,进行减法运算,然后将结果再转换回N进制。但难点在于各种边界条件和异常处理。

需要处理的异常情况包括:

  1. N值必须在2到35之间
  2. 输入的字符串只能包含数字0-9和小写字母a-z
  3. 除了单独的"0"以外,不能有前导0
  4. 字符串长度不能超过100
  5. 字符串中的每个字符必须是有效的N进制数字,例如在2进制中,只能出现0和1

处理步骤:

  1. 首先检查N是否在有效范围内
  2. 然后验证两个输入字符串是否符合要求
  3. 将两个N进制字符串转换为十进制数
  4. 计算差值的绝对值,并确定结果的符号
  5. 将差值转换回N进制字符串
  6. 输出符号和结果字符串

在实现时需要注意的技巧:

  • 对于非数字字符,可以使用字符的ASCII码值减去一个偏移量(如'a'的码值减87)来得到对应的数值
  • 在Java和C++中需要使用长整型来避免可能的整数溢出
  • 在检查字符是否为有效的N进制数字时,要区分数字字符和字母字符的处理方式

时间复杂度:O(L),其中L是输入字符串的最大长度。主要操作是字符串处理和进制转换,都是线性时间复杂度。 空间复杂度:O(L),主要用于存储处理过程中的字符串。

参考代码

  • Python
import sys
import re
input = lambda:sys.stdin.readline().strip()

# 输入获取
n_str, b_sub, sub = input().split()
n = int(n_str)

# 将十进制数转换为n进制字符串
def to_base_n(num, base):
    if num == 0:
        return "0"
    
    chars = "0123456789abcdefghijklmnopqrstuvwxyz"
    result = ""
    
    while num > 0:
        result = chars[num % base] + result
        num //= base
    
    return result

# 验证字符串是否符合N进制规则
def is_valid(s, n):
    # 检查前导0
    if s.startswith("0") and s != "0":
        return False
    
    # 检查非法字符
    if re.search("[^0-9a-z]", s):
        return False
    
    # 检查长度
    if len(s) > 100:
        return False
    
    # 检查每个字符是否为有效的n进制数字
    for c in s:
        val = int(c, 36)  # 使用36进制解析,可以处理0-9和a-z
        if val >= n:
            return False
    
    return True

# 主函数
def solve():
    # 检查进制范围
    if n < 2 or n > 35:
        return "-1"
    
    # 验证输入字符串
    if not is_valid(b_sub, n) or not is_valid(sub, n):
        return "-1"
    
    # 将n进制转换为十进制
    try:
        dec_b_sub = int(b_sub, n)
        dec_sub = int(sub, n)
    except ValueError:
        return "-1"
    
    # 计算差值并确定符号
    diff = abs(dec_b_sub - dec_sub)
    sign = "1" if dec_b_sub < dec_sub else "0"
    
    # 转换结果为n进制
    result = to_base_n(diff, n)
    
    return f"{sign} {result}"

# 输出结果
print(solve())
  • Cpp
#include <bits/stdc++.h>
using namespace std;

// 将十进制数转换为N进制字符串
string toBaseN(long long num, int base) {
    if (num == 0) return "0";
    
    string re

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

算法刷题笔记 文章被收录于专栏

本专栏收集并整理了一些刷题笔记

全部评论

相关推荐

美团 算法策略 25k 硕士985
点赞 评论 收藏
分享
10-23 13:59
运营
最近这段时间,身边不少&nbsp;IT&nbsp;同行遭遇了&nbsp;“毕业”&nbsp;危机。看着他们为找工作焦虑奔波的模样,我不禁想起自己曾经失业时的经历。当时,正是依靠几个实用的网站,我才顺利度过空窗期,重新找到心仪的工作。今天,就把这&nbsp;4&nbsp;个能帮&nbsp;IT&nbsp;人快速回血的网站分享给大家,无论你是想找全职工作、接私活补贴收入,还是利用失业期学习新技能,总有一个能满足你的需求。一、牛客网:IT&nbsp;面试的&nbsp;“急救包”,全职求职快人一步对于想快速找到全职工作的&nbsp;IT&nbsp;人来说,牛客网绝对是不可错过的&nbsp;“利器”,堪称&nbsp;IT&nbsp;面试的&nbsp;“急救包”。这个网站收录了各大互联网公司的历年面试真题,内容覆盖全面且分类细致。从基础的&nbsp;Java&nbsp;语法、算法编程题,到复杂的架构设计、项目复盘案例,几乎涵盖了&nbsp;IT&nbsp;岗位面试的所有核心考点。更方便的是,网站支持在线敲代码刷题,每道题做错后都会有详细的解析,不仅能让你知道错在哪里,还能帮你理清解题思路,巩固相关知识点。我当年失业后,每天都会在牛客网花&nbsp;2&nbsp;小时刷题。尤其关注&nbsp;“面经板块”,这里有很多同行实时分享最新的面试流程和高频考点。比如某大厂近期面试时重点考察的微服务架构设计、分布式事务解决方案等内容,提前在面经里了解后,我就能针对性地准备应对思路,等到真正面试时,明显比没准备的人更从容,大大降低了紧张感。除此之外,牛客网的内推通道也十分实用。不少企业的&nbsp;HR&nbsp;会直接在平台上发布招聘需求,求职者可以跳过猎头环节,直接与&nbsp;HR&nbsp;沟通对接。这种方式不仅减少了中间流程,反馈速度也更快,能让你在求职竞争中抢占先机。二、IT&nbsp;找活网:IT&nbsp;人的&nbsp;“饭碗储备库”,私活变现两不误如果说牛客网是全职求职的好帮手,那&nbsp;IT&nbsp;找活网就是我失业期的&nbsp;“救命稻草”,它就像一个专属于&nbsp;IT&nbsp;人的&nbsp;“饭碗储备库”,靠它我当年接了&nbsp;3&nbsp;个私活,成功撑过了空窗期。和市面上那些综合类接单网站不同,IT&nbsp;找活网只聚焦&nbsp;IT&nbsp;领域。无论是软件开发、前端设计、移动端开发,还是当下热门的&nbsp;AI&nbsp;算法、数据分析、测试运维等需求,每天平台上都会更新大量真实的&nbsp;IT&nbsp;项目,没有杂七杂八的非&nbsp;IT&nbsp;需求干扰,能让你更精准地匹配到适合自己的机会。最让人省心的是,在这个平台上可以直接对接企业甲方,无需通过中介,也就不用被抽取佣金,自己的劳动所得能全部收入囊中。而且每个项目的预算、需求描述都写得明明白白,你还能查看甲方过往的合作评价,了解对方的信誉和合作模式,大大降低了踩坑的概率。我当时刚失业,凭借&nbsp;“Python&nbsp;开发”&nbsp;的技术栈在平台上匹配项目,仅仅&nbsp;3&nbsp;天就接到了一个小程序开发的私活。更值得一提的是,这个平台不只是能接私活,还支持技术经验变现。你可以把自己做项目时的踩坑笔记、技术总结写成文章,一旦有人查看并按需下载附件,你就能获得收益。我之前写的《Python&nbsp;爬虫反爬实战》,单月分成就相当可观。即便现在有了稳定工作,我也会每天登录刷一刷,既能接私活补贴收入,又能通过技术交流了解行业最新动态,保持对行业的敏感度。三、GitHub:技术能力的&nbsp;“加分项”,简历含金量&nbsp;UP&nbsp;UP失业期最忌讳的就是技术断档,而&nbsp;GitHub&nbsp;就是帮助&nbsp;IT&nbsp;人保持技术活跃度、提升简历含金量的绝佳平台,堪称技术能力的&nbsp;“加分项”。GitHub&nbsp;上有海量的开源项目,无论你是想练习新框架(比如近期热门的&nbsp;Vue3、SpringBoot3),还是想参与真实的开源协作、积累项目经验,都能在这里找到合适的机会。我当年失业时,为了让简历更有亮点,特意找了一个电商后台管理系统的开源项目参与其中,负责部分功能的代码开发。这段经历不仅让我熟练掌握了新的开发技术,还积累了实际的项目经验。当我把这段经历写进简历后,在面试中,面试官特意针对这个项目的细节进行提问,我能清晰地阐述开发思路和解决问题的方法,瞬间赢得了面试官的好感。现在很多公司招聘技术岗位时,都会关注求职者的&nbsp;GitHub&nbsp;主页。相比简历上空泛的&nbsp;“熟悉&nbsp;XX&nbsp;技术”,一个活跃的&nbsp;GitHub&nbsp;贡献记录,能更直观地展现你的技术能力和学习热情,让你在众多求职者中脱颖而出。四、慕课网:充电学习的&nbsp;“加油站”,补短板促提升如果想趁失业期弥补技术短板,学习新的技能方向,比如之前没接触过的&nbsp;AI&nbsp;开发、低代码开发等,慕课网就是一个优质的&nbsp;“加油站”。慕课网的&nbsp;IT&nbsp;课程体系非常完善,从入门级的基础课程到高阶的实战课程,覆盖了多个技术领域。而且课程大多结合实战项目,你可以跟着课程一步步完成项目开发,学完之后不仅能掌握相关技能,还能将项目经验写进简历,为求职加分。我当年失业后,就利用&nbsp;2&nbsp;周时间在慕课网上学习了&nbsp;Python&nbsp;数据分析课程,并跟着完成了一个用户行为分析的实战项目。后来面试一家数据服务公司时,这个项目正好与岗位需求对口,凭借项目中积累的经验,我顺利通过面试拿到了&nbsp;offer。更贴心的是,慕课网的很多课程都配备了专属学习群。在学习过程中遇到问题,你可以在群里向老师和同学请教,大家一起交流讨论,比自己一个人瞎琢磨效率高太多,能帮助你更快地掌握新知识。失业对于&nbsp;IT&nbsp;人来说,或许是职业道路上的一次短暂挫折,但只要选对工具、积极行动,就能快速调整状态,重返职场赛道。希望这&nbsp;4&nbsp;个网站能给正处于迷茫期的你带来帮助,也祝愿大家都能早日找到适合自己的发展方向,开启新的职业篇章!(注:文档部分内容可能由&nbsp;AI&nbsp;生成)
点赞 评论 收藏
分享
评论
1
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务