每日练习——leetcode402. 移掉 K 位数字和17. 电话号码的字母组合

news2024/10/5 22:23:40

目录

402. 移掉 K 位数字

题目描述

解题思路

代码实现

17. 电话号码的字母组合

题目描述

解题思路

代码实现


402. 移掉 K 位数字

题目描述

给你一个以字符串表示的非负整数 num 和一个整数 k ,移除这个数中的 k 位数字,使得剩下的数字最小。请你以字符串形式返回这个最小的数字。

示例 1 :

输入:num = "1432219", k = 3
输出:"1219"
解释:移除掉三个数字 4, 3, 和 2 形成一个新的最小的数字 1219 。

示例 2 :

输入:num = "10200", k = 1
输出:"200"
解释:移掉首位的 1 剩下的数字为 200. 注意输出不能有任何前导零。

示例 3 :

输入:num = "10", k = 2
输出:"0"
解释:从原数字移除所有的数字,剩余为空就是 0 。

提示:

  • 1 <= k <= num.length <= 105
  • num 仅由若干位数字(0 - 9)组成
  • 除了 0 本身之外,num 不含任何前导零

解题思路

利用单调栈的思想来移除字符串中的k个数字,使得剩下的数字组成的数最小。

  1. 初始化:

    • 获取输入字符串num的长度length
    • 初始化一个栈stack,用于存放结果。栈的大小为length + 1,因为最后还需要存放一个字符串结束符\0
    • 初始化栈顶指针top为-1,表示栈为空。
    • 初始化遍历索引i为0。
  2. 遍历输入字符串:

    • 对于输入字符串中的每个字符,进行以下操作:
      • 如果栈不为空且栈顶元素大于当前字符,并且还有剩余要移除的字符数k,那么将栈顶元素弹出,同时k减1。这一步是为了确保栈内的元素是单调递增的,这样可以确保得到的数最小。
      • 如果当前字符不是'0'或者栈不为空,那么将当前字符压入栈中。这里有一个条件判断是为了避免在结果的最前面出现前导零。
  3. 处理剩余的移除次数:

    • 如果遍历完输入字符串后还有剩余的移除次数k,那么继续从栈顶弹出元素,直到移除次数用完或者栈为空。
  4. 处理特殊情况:

    • 如果栈为空(即所有字符都被移除了),那么需要在栈中放入一个'0'字符。
  5. 结束处理:

    • 在栈顶放入一个字符串结束符\0
    • 返回栈的地址作为结果。

代码实现

char* removeKdigits(char* num, int k) {
    int length = strlen(num), top = -1, i = 0;
    char* stack = (char*)malloc(sizeof(char) * (length + 1));
    for (i; i < length; i++) {
        while (top != -1 && stack[top] > num[i] && k > 0) {
            top--;
            k--;
        }
        if (num[i] != '0' || top != -1)
            stack[++top] = num[i];
    }
    while (k > 0 && top > -1) {
        top--;
        k--;
    }
    if (top == -1)
        stack[++top] = '0';
    stack[++top] = '\0';
    return stack;
}

17. 电话号码的字母组合

题目描述

给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。

给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。

示例 1:

输入:digits = "23"
输出:["ad","ae","af","bd","be","bf","cd","ce","cf"]

示例 2:

输入:digits = ""
输出:[]

示例 3:

输入:digits = "2"
输出:["a","b","c"]

提示:

  • 0 <= digits.length <= 4
  • digits[i] 是范围 ['2', '9'] 的一个数字。

解题思路

  1. 初始化
    • 定义二维字符数组 map,将每个数字映射到其对应的字母集合。
    • 定义全局变量 path(用于存储当前组合),ans(用于存储所有组合),pathsize 和 anssize(分别用于跟踪 path 和 ans 的大小),以及 n(输入数字字符串的长度)。
  2. letterCombinations 函数
    • 获取输入数字字符串的长度 n
    • 为 path 和 ans 分配内存空间。
    • 检查如果 n 为0,则直接返回空数组,并设置 returnSize 为0。
  3. 回溯函数 backtrace
    • 递归终止条件:如果已处理完所有数字字符(idx == n),则复制当前 path 到新字符串 temp,并将 temp 添加到 ans 数组中。
    • 递归过程
      • 获取当前数字字符在 map 中对应的字母集合 words
      • 遍历 words 中的每个字母:
        • 将当前字母添加到 path 中。
        • 递归调用 backtrace 函数处理下一个数字字符。
        • 回溯:将 path 中的最后一个字母移除,以尝试 words 中的下一个字母。
  4. 返回结果
    • 在 letterCombinations 函数中,将 anssize 赋值给 returnSize
    • 返回 ans 数组,其中包含了所有可能的字母组合。

代码实现

/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
char map[10][5] = {"",    "",    "abc",  "def", "ghi",
                   "jkl", "mno", "pqrs", "tuv", "wxyz"};
char* path;
char** ans;
int pathsize, anssize, n;
void backtrace(int idx, char* digits) {
    if (idx == n) {
        char* temp = (char*)malloc(sizeof(char) * (n + 1));
        for (int i = 0; i < n; i++)
            temp[i] = path[i];
        temp[n] = '\0';
        ans[anssize++] = temp;
        return;
    }
    char* words = map[digits[idx] - '0'];
    for (int i = 0; i < strlen(words); i++) {
        path[pathsize++] = words[i];
        backtrace(idx + 1, digits);
        pathsize--;
    }
}
char** letterCombinations(char* digits, int* returnSize) {
    n = strlen(digits);
    path = (char*)malloc(sizeof(char) * n);
    ans = (char**)malloc(sizeof(char*) * 300);
    anssize = pathsize = 0;
    if (n == 0) {
        *returnSize = 0;
        return ans;
    }
    backtrace(0, digits);
    *returnSize = anssize;
    return ans;
}

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

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

相关文章

阿里云4核8G云服务器价格多少钱?700元1年

阿里云4核8G云服务器价格多少钱&#xff1f;700元1年。阿里云4核8G服务器租用优惠价格700元1年&#xff0c;配置为ECS通用算力型u1实例&#xff08;ecs.u1-c1m2.xlarge&#xff09;4核8G配置、1M到3M带宽可选、ESSD Entry系统盘20G到40G可选&#xff0c;CPU采用Intel(R) Xeon(R…

JVM 方法调用之方法分派

JVM 方法调用之方法分派 文章目录 JVM 方法调用之方法分派1.何为分派2.静态分派3.动态分派4.单分派与多分派5.动态分派的实现 1.何为分派 在上一篇文章《方法调用之解析调用》中讲到了解析调用&#xff0c;而解析调用是一个静态过程&#xff0c;在类加载的解析阶段就确定了方法…

黑马点评(四) -- 分布式锁

1 . 分布式锁基本原理和实现方式对比 分布式锁&#xff1a;满足分布式系统或集群模式下多进程可见并且互斥的锁。 分布式锁的核心思想就是让大家都使用同一把锁&#xff0c;只要大家使用的是同一把锁&#xff0c;那么我们就能锁住线程&#xff0c;不让线程进行&#xff0c;让…

​宁德时代:用一块电池玩转两个万亿赛道

2022 到 2023 连续两年&#xff0c;被称为国内储能行业的大储&#xff08;发电侧、电网侧&#xff09;元年和中储&#xff08;工商业&#xff09;元年&#xff0c;整个储能行业可谓是异常火爆&#xff0c;众多资本或企业纷纷涌入该赛道。 对于行业从业者来说&#xff0c;所从事…

第十六篇:springboot案例

文章目录 一、准备工作1.1 需求说明1.2 环境搭建1.3 开发规范1.4 思路 二、部门管理2.1 查询部门2.2 删除部门2.3 新增部门2.4 修改部门2.5 RequestMapping 三、员工管理3.1 分页查询3.2 删除员工3.3 新增员工3.3.1 新增员工3.3.2 文件上传 3.4 修改员工3.4.1 页面回显3.4.2 修…

MySQL基础知识——MySQL事务

事务背景 什么是事务&#xff1f; 一组由一个或多个数据库操作组成的操作组&#xff0c;能够原子的执行&#xff0c;且事务间相互独立&#xff1b; 简单来说&#xff0c;事务就是要保证一组数据库操作&#xff0c;要么全部成功&#xff0c;要么全部失败。 注&#xff1a;MyS…

【Java探索之旅】掌握数组操作,轻松应对编程挑战

&#x1f3a5; 屿小夏 &#xff1a; 个人主页 &#x1f525;个人专栏 &#xff1a; Java编程秘籍 &#x1f304; 莫道桑榆晚&#xff0c;为霞尚满天&#xff01; 文章目录 &#x1f4d1;前言一、数组巩固练习1.1 数组转字符串1.2 数组拷贝1.3 求数组中的平均值1.4 查找数组中指…

Node Version Manager(nvm):轻松管理 Node.js 版本的利器

文章目录 前言一、名词解释1、node.js是什么&#xff1f;2、nvm是什么&#xff1f; 二、安装1.在 Linux/macOS 上安装2.在 Windows 上安装 二、使用1.查看可安装的node版本2.安装node3. 查看已安装node4.切换node版本5.其它 总结 前言 Node.js 是现代 Web 开发中不可或缺的一部…

书生·浦语大模型实战营之Lagent AgentLego 智能体应用搭建

书生浦语大模型实战营之Lagent & AgentLego 智能体应用搭建 Lagent 简介 Lagent 是一个轻量级开源智能体框架&#xff0c;旨在让用户可以高效地构建基于大语言模型的智能体。同时它也提供了一些典型工具以增强大语言模型的能力。 Lagent 目前已经支持了包括 AutoGPT、R…

【系统分析师】应用数学部分

文章目录 1、图论应用1.1 最小生成树1.2 最短路径1.3 网络与最大流量 2、运筹方法2.1 关键路径法2.2 线性规划2.3 动态规划2.4 预测与决策2.4.1 囚徒困境2.4.2 实例&#xff1a;商业竞争 2.5 状态转移矩阵2.6 排队论2.7 决策2.7.1 决策2.7.2不确定型决策2.7.3 决策树2.7.4 决策…

4.17号驱动

中断子系统 1. 中断工作原理 1.1 异常处理流程 保存现场(cpu自动完成) 保存cpsr寄存器中的值&#xff0c;到spsr_寄存器中 修改cpsr寄存器中的值 修改状态位(T位) 根据需要禁止相应的中断位(I/F) 修改对应模式位 保存函数的返回地址到lr寄存器中 修改pc指向异常向量表 …

Realsense D455 调试

1 Realsense D455 配置&#xff1a; RGB&#xff1a;彩色相机&#xff0c;FOV&#xff08;h&#xff0c;v&#xff09;&#xff08; 90*65 &#xff09;红外点阵发射&#xff1a;位于上图中RGB右边&#xff0c;发射特定模式的红外光&#xff0c;通常是一种点阵图案&#xff0c…

深度学习架构(CNN、RNN、GAN、Transformers、编码器-解码器架构)的友好介绍。

一、说明 本博客旨在对涉及卷积神经网络 &#xff08;CNN&#xff09;、递归神经网络 &#xff08;RNN&#xff09;、生成对抗网络 &#xff08;GAN&#xff09;、转换器和编码器-解码器架构的深度学习架构进行友好介绍。让我们开始吧&#xff01;&#xff01; 二、卷积神经网络…

Dryad Girl Fawnia

一个可爱的Dryad Girl Fawnia的三维模型。她有ARKit混合形状,人形装备,多种颜色可供选择。她将是一个完美的角色,幻想或装扮游戏。 🔥 Dryad Girl | Fawnia 一个可爱的Dryad Girl Fawnia的三维模型。她有ARKit混合形状,人形装备,多种颜色可供选择。她将是一个完美的角色…

网络攻防演练:一场针锋相对的技术博弈与安全防护实践

随着ChatGPT5的即将上线&#xff0c;其安全防护能力面临更为严峻的考验。网络攻防演练作为检验系统安全性能、提升防御体系的关键环节&#xff0c;对于确保ChatGPT5的安全稳定运行具有重要意义。本文将深入探讨网络攻击与防守之间的动态关系&#xff0c;并提供在网络攻防演练中…

【Leetcode每日一题】 分治 - 颜色分类(难度⭐⭐)(57)

1. 题目解析 题目链接&#xff1a;75. 颜色分类 这个问题的理解其实相当简单&#xff0c;只需看一下示例&#xff0c;基本就能明白其含义了。 2.算法原理 算法思路解析 本算法采用三指针法&#xff0c;将数组划分为三个区域&#xff0c;分别用于存放值为0、1和2的元素。通过…

vivado 设置 VIO 核以执行测量、查看 VIO 核状态

设置 VIO 核以执行测量 您添加到自己的设计中的 VIO 核会显示在“硬件 (Hardware) ”窗口中的目标器件下。如果未显示这些 VIO 核 &#xff0c; 请右键 单击器件并选择“ Refresh Hardware ”。这样将重新扫描 FPGA 或 ACAP 并刷新“ Hardware ”窗口。 注释 &#xff…

【免费】基于SOE算法的多时段随机配电网重构方法

1 主要内容 该程序是完全复现《Switch Opening and Exchange Method for Stochastic Distribution Network Reconfiguration》&#xff0c;也是一个开源代码&#xff0c;网上有些人卖的还挺贵&#xff0c;本次免费分享给大家&#xff0c;代码主要做的是一个通过配电网重构获取…

“面包板”是什么?有啥用?

同学们大家好&#xff0c;今天我们继续学习杨欣的《电子设计从零开始》&#xff0c;这本书从基本原理出发&#xff0c;知识点遍及无线电通讯、仪器设计、三极管电路、集成电路、传感器、数字电路基础、单片机及应用实例&#xff0c;可以说是全面系统地介绍了电子设计所需的知识…

一种范围可调式测径仪 满足生产各规格检测!

摘要&#xff1a;范围可调式测径仪&#xff0c;满足各种外径尺寸的产品检测&#xff0c;囊括产线的所有规格&#xff0c;性价比更高的测径仪。 关键词&#xff1a;测径仪,范围可调测径仪,在线测径仪 引言 生产线中&#xff0c;各种外径尺寸的线材、棒材、管材都有生产&#xff…