每日练习——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.mzph.cn/news/816324.shtml

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

相关文章

Python杂记--使用asyncio构建HTTP代理服务器

Python杂记--使用asyncio构建HTTP代理服务器 引言基础知识代码实现 引言 本文将介绍 HTTP 代理的基本原理&#xff0c;并带领读者构建一个自己的 HTTP 代理服务器。代码中不会涉及到任何第三方库&#xff0c;全部由 asyncio 实现&#xff0c;性能优秀&#xff0c;安全可靠。 基…

Linux-文件系统理解(磁盘的物理与逻辑结构、什么是inode、OS如何管理磁盘)

一、磁盘 磁盘的物理结构 磁盘的本质是一个机械设备&#xff0c;可以存储大量的二进制信息&#xff0c;是实现数据存储的基础硬件设施&#xff0c;磁盘的盘片类似于光盘&#xff0c;不过盘片的两面都是可读可写可擦除的&#xff0c;每个盘面都有一个磁头&#xff0c;马达可以使…

攻防世界---Web_php_include

1.题目链接 2.补充知识&#xff1a; 3.构造&#xff1a;执行成功 /?pagedata://text/plain,<?php phpinfo()?> 4.构造下面url&#xff0c;得到目录路径 /?pagedata://text/plain,<?php echo $_SERVER[DOCUMENT_ROOT]?> 5构造下面url&#xff0c;读取该路径的…

【网站项目】面向企事业单位的项目申报小程序

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

Node.js、Java、Python、PHP在构建BS系统时的特点比较

在现代软件开发领域&#xff0c;构建一个稳定、高效的B/S&#xff08;浏览器/服务器&#xff09;系统对于企业的信息化发展至关重要。Node.js、Java、Python和PHP是当下流行的几种后端开发技术&#xff0c;它们各自具有独特的特点和优势。本文将对这几种技术在构建B/S系统时的特…

网络编程【InetAddress , TCP 、UDP 、HTTP 案例】

day38上 网络编程 InetAddress 理解&#xff1a;表示主机类 一个域名 对应 多个IP地址 public static void main(String[] args) throws UnknownHostException {//获取本机的IP地址 // InetAddress localHost InetAddress.getLocalHost(); // System.out.println(localHos…

简单认识Git(dirsearch、githack下载),git泄露(ctfhub)

目录 dirsearch下载地址: githack下载&#xff08;一次不成功可多试几次&#xff09; 一、什么是Git 1.git结构 2.git常用命令及示例 3.Git泄露原理 二、Git泄露 1.Log 2.Stash 3.Index 工具准备&#xff1a;dirsearch、githack dirsearch下载地址: GitHub - mauroso…

如何解决微信小程序无法使用css3过度属性transition

由于微信小程序不支持CSS3过度属性transition,所以我们需要利用微信小程序api进行画面过度的展示 首先是官方示例: wxml: <view animation="{{animationData}}" style="background:red;height:100rpx;width:100rpx"></view> js: Page(…

搭建Hive 3.x环境(CentOS 9 + Hadoop3.x)

零、资源准备 虚拟机相关&#xff1a; VMware workstation 16&#xff1a;虚拟机 > vmware_177981.zipCentOS Stream 9&#xff1a;虚拟机 > CentOS-Stream-9-latest-x86_64-dvd1.iso JDK jdk1.8&#xff1a;JDK > jdk-8u261-linux-x64.tar.gz Hadoop Hadoop 3.3.6&a…

【Java】内存可见性问题是什么?

文章目录 内存模型内存可见性解决方案volatile 内存模型 什么是JAVA 内存模型&#xff1f; Java Memory Model (JAVA 内存模型&#xff09;是描述线程之间如何通过内存(memory)来进行交互。 具体说来&#xff0c; JVM中存在一个主存区&#xff08;Main Memory或Java Heap Mem…

架构师系列-搜索引擎ElasticSearch(七)- 集群管理之分片

集群健康检查 Elasticsearch 的集群监控信息中包含了许多的统计数据&#xff0c;其中最为重要的一项就是集群健康&#xff0c;它在 status字段中展示为 green&#xff08;所有主分片和副本分片都正常&#xff09;、yellow&#xff08;所有数据可用&#xff0c;有些副本分片尚未…

Collection与数据结构 二叉树(三):二叉树精选OJ例题(下)

1.二叉树的分层遍历 OJ链接 上面这道题是分层式的层序遍历,每一层有哪些结点都很明确,我们先想一想普通的层序遍历怎么做 /*** 层序遍历* param root*/public void levelOrder1(Node root){Queue<Node> queue new LinkedList<>();queue.offer(root);while (!qu…

Vue 2实现未登录拦截页面功能

在Vue 2中实现未登录拦截页面功能&#xff0c;通常可以通过路由守卫和全局前置守卫来完成。以下是一个基本的实现步骤和示例代码&#xff0c;帮助你创建一个简单的未登录拦截逻辑。 步骤 1: 安装和配置路由 首先&#xff0c;确保你的Vue项目已经安装并配置了vue-router。如果…

Spring Boot(二)— 自定义Spring Boot Starter

在Spring Boot中&#xff0c;自定义Spring Boot Starter是一个常见且强大的功能&#xff0c;它允许开发者为特定的功能或库创建自己的自动配置&#xff0c;从而简化集成过程。 1 前置知识 Spring Boot的事件为应用的启动和关闭提供了详细的上下文信息&#xff0c;使得开发者能…

基于表面势的增强型p-GaN HEMT器件模型

来源&#xff1a;电子学报 22年 摘要 为了满足功率电路及系统设计对p-GaN HEMT&#xff08;High Electron Mobility Transistor&#xff09;器件模型的需求&#xff0c;本文建立了一套基于表面势计算方法的增强型p-GaN HEMT器件SPICE&#xff08;Simulation Program with Int…

Golang | Leetcode Golang题解之第27题移除元素

题目&#xff1a; 题解&#xff1a; func removeElement(nums []int, val int) int {left, right : 0, len(nums)for left < right {if nums[left] val {nums[left] nums[right-1]right--} else {left}}return left }

软件杯 深度学习卷积神经网络垃圾分类系统 - 深度学习 神经网络 图像识别 垃圾分类 算法 小程序

文章目录 0 简介1 背景意义2 数据集3 数据探索4 数据增广(数据集补充)5 垃圾图像分类5.1 迁移学习5.1.1 什么是迁移学习&#xff1f;5.1.2 为什么要迁移学习&#xff1f; 5.2 模型选择5.3 训练环境5.3.1 硬件配置5.3.2 软件配置 5.4 训练过程5.5 模型分类效果(PC端) 6 构建垃圾…

Eland上传bge-large-zh-v1.5向量化模型到ElasticSearch中

最近需要做一些向量检索&#xff0c;试试ES 一、准备 系统&#xff1a;MacOS 14.3.1 ElasticSearch&#xff1a;8.13.2 Kibana&#xff1a;8.13.2 本地单机环境&#xff0c;无集群&#xff0c;也不基于Docker BGE是一个常见的文本转向量的模型&#xff0c;在很多大模型RAG应…

数据仓库—维度建模—维度表设计

维度表 维度表(Dimension Table)是数据仓库中描述业务过程中各种维度信息的表,用于提供上下文和描述性信息,以丰富事实数据的分析 维度表是维度建模的灵魂所在,在维度表设计中碰到的问题(比如维度变化、维度层次、维度一致性、维度整合和拆分等)都会直接关系到维度建模…

docker和kubernetes(k8s)

docker是什么 运行程序需要环境&#xff0c;不同的环境&#xff0c;程序运行的结果就不一样。将程序打包给其它客户端使用时&#xff0c;客户端需要自己配置相应的环境。我们将程序和环境一起打包给其它客户端&#xff0c;客户端可直接运行程序。docker容器作为程序和操作系统…