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

目录

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.rhkb.cn/news/311187.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

为了保护版权,有大量图片需要加logo水印怎么办?快速批量加水印 一键可批量加水印几十张 几百张

一&#xff0c;加水印必要性 在数字化时代&#xff0c;图片作为信息传递的重要媒介&#xff0c;其保护和管理显得尤为重要。而给图片添加水印则是一种有效的方式&#xff0c;它不仅能够防止图片被未经授权地复制和盗用&#xff0c;还能够标明图片的来源和版权信息&#xff0c;…

【Spring】依赖注入(DI)时常用的注解@Autowired和@Value

目录 1、Autowired 自动装配 1.1、要实现自动装配不是一定要使用Autowired 1.2、Autowired的特性 &#xff08;1&#xff09;首先会根据类型去spring容器中找(bytype),如果有多个类型&#xff0c;会根据名字再去spring容器中找(byname) &#xff08;2&#xff09;如果根据名…

springcloud-fegin 组件调用

一、Feign 概述 Feign是Netflix开发的声明式、模板化的HTTP客户端&#xff0c; Feign可以帮助我们更快捷、优雅地调用HTTP API。 在Spring Cloud中&#xff0c;使用Feign非常简单——创建一个接口&#xff0c;并在接口上添加一些注解&#xff0c;代码就完成了。Feign支持多种…

llama-factory SFT系列教程 (二),大模型在自定义数据集 lora 训练与部署

文章目录 简介支持的模型列表2. 添加自定义数据集3. lora 微调4. 大模型 lora 权重&#xff0c;部署问题 参考资料 简介 文章列表&#xff1a; llama-factory SFT系列教程 (一)&#xff0c;大模型 API 部署与使用llama-factory SFT系列教程 (二)&#xff0c;大模型在自定义数…

Day01——NestJS学习之了解、安装、运行

什么是 Nest.js&#xff1f; NestJs 官方简介: Nest (NestJS) 是一个用于构建高效、可扩展的 Node.js 服务器端应用程序的开发框架。它利用 JavaScript 的渐进增强的能力&#xff0c;使用并完全支持 TypeScript &#xff08;仍然允许开发者使用纯 JavaScript 进行开发&#x…

leetcode:739.每日温度/496.下一个更大元素

单调栈的应用&#xff1a; 求解当前元素右边比该元素大的第一个元素&#xff08;左右、大小都可以&#xff09;。 单调栈的构成&#xff1a; 单调栈里存储数组的下标&#xff1b; 单调栈里的元素递增&#xff0c;求解当前元素右边比该元素大的第一个元素&#xff1b;元素递…

【Java开发指南 | 第六篇】Java成员变量(实例变量)、 类变量(静态变量)

读者可订阅专栏&#xff1a;Java开发指南 |【CSDN秋说】 文章目录 成员变量&#xff08;实例变量&#xff09;类变量&#xff08;静态变量&#xff09;定义方式静态变量的使用场景 成员变量&#xff08;实例变量&#xff09; 成员变量声明在一个类中&#xff0c;但在方法、构造…

【opencv】示例-videocapture_openni.cpp 深度数据获取和处理的示例

该代码是一个与使用OpenCV进行深度传感器捕获和处理相关的程序的一部分。主要功能包括处理Kinect或XtionPRO等深度传感器数据&#xff0c;解析命令行参数&#xff0c;打开视频捕获设备&#xff0c;以及在GUI上显示深度图&#xff0c;彩色图像&#xff0c;和红外图像等。代码中使…

linux 自定义快捷指令(docker

vi /root/.bashrc alias disdocker images alias dpsdocker ps --format "table {{.ID}}\t{{.Image}}\t{{.Ports}}\t{{.Status}}\t{{.Names}}" 保存退出后使用sourece /root/.bashrc 让其立即生效 sourece /root/.bashrc

byobu

byobu 终端多路复用器 一、byobu 安装二、byobu 使用三、其他终端多路复用器四、ssh byobu 远程协作 系统环境: linux(ubuntu,debian,kali) 一、byobu 安装 byobu 是包装过的tmux #sudo apt install tmux sudo apt install byobubyobu二、byobu 使用 创建窗口: Ctrl a c…

HashMap的扩容看这一篇足够

在Java中&#xff0c;对于HashMap这样的实现&#xff0c;put方法是用来将一个键值对插入到Map中的核心方法。以下是HashMap类中put方法的大致执行流程&#xff1a; 计算Hash值&#xff1a; 首先&#xff0c;put方法会接收一个键&#xff08;Key&#xff09;和一个值&#xff0…

攻防世界13-simple_php

13-simple_php <?php show_source(*__FILE__*);//高亮文件 include("config.php");//文件包含在内 $a$_GET[a];//获得a $b$_GET[b];//获得b if($a0 and $a){ //判断a是否满足条件echo $flag1; //满足就输出flag1 } if(is_numeric($b)){ //判断b的条件&#x…

Python | Leetcode Python题解之第26题删除有序数组中的重复项

题目&#xff1a; 题解&#xff1a; class Solution:def removeDuplicates(self, nums: List[int]) -> int:if not nums:return 0n len(nums)fast slow 1while fast < n:if nums[fast] ! nums[fast - 1]:nums[slow] nums[fast]slow 1fast 1return slow

Git可视化工具 - 推荐

概述 Git版本管理工具是我们日常开发中常用的工具&#xff0c;熟练使用它可以提高我们的工作效率。 当然老司机基本使用命令行的方式进行操作&#xff0c;新手可借助可视化工具来进行过渡&#xff0c;命令行与可视化工具结合使用来加深对Git的熟悉程度。 下面推荐两个较受欢迎…

MySQL 试图

视图功能在 5.0 以后的版本启用 视图是一张虚表。数据表确实包含了具体数据并且保存到硬盘中的实表。视图使用数据检索语句动态生 成的一张虚表。每一次数据服务重启或者系统重启之后&#xff0c;在数据库服务启动期间&#xff0c;会使用创建视图的语 句重新生成视图中的数据&…

BERT论文解读及情感分类实战

文章目录 简介BERT文章主要贡献BERT模型架构技术细节任务1 Masked LM&#xff08;MLM&#xff09;任务2 Next Sentence Prediction (NSP)模型输入 下游任务微调GLUE数据集SQuAD v1.1 和 v2.0NER 情感分类实战IMDB影评情感数据集数据集构建模型构建超参数设置训练结果注意事项 简…

学习Rust的第三天:猜谜游戏

基于Steve Klabnik的《The Rust Programming Language》一书。今天我们在rust中建立一个猜谜游戏。 Introduction 介绍 We will build a game that will pick a random number between 1 to 100 and the user has to guess the number on a correct guess the user wins. 我们将…

Nginx内存池相关源码剖析(六)外部资源释放和内存池销毁

ngx_destroy_pool函数 先执行回调函数释放所有的外部资源&#xff0c;然后free释放所有的大块内存和小块内存。 // 释放外部资源&#xff0c;销毁内存池 void ngx_destroy_pool(ngx_pool_t *pool) {ngx_pool_t *p, *n;ngx_pool_large_t *l;ngx_pool_cleanup_t *…

用海豚调度器定时调度从Kafka到HDFS的kettle任务脚本

在实际项目中&#xff0c;从Kafka到HDFS的数据是每天自动生成一个文件&#xff0c;按日期区分。而且Kafka在不断生产数据&#xff0c;因此看看kettle是不是需要时刻运行&#xff1f;能不能按照每日自动生成数据文件&#xff1f; 为了测试实际项目中的海豚定时调度从Kafka到HDF…

【计算机网络】常用编码方式+例题(曼彻斯特编码、差分曼彻斯特编码...)

常用编码方式例题 常用编码方式练习画出四种编码20221题342015题342013题34 常用编码方式 练习 画出四种编码 20221题34 这个题目的考察是差分曼彻斯特编码。 差分曼彻斯特编码在每个码元的中间时刻电平都会发生跳变。与曼彻斯特编码不同的是&#xff1a;电平的跳变仅代表时钟…