2288. 价格减免

题目

给定一个字符串列表 sentence,表示一个句子,其中每个单词可以包含数字、小写字母和美元符号 $。如果单词的形式为美元符号后跟着一个非负实数,那么这个单词就表示一个价格。我们需要在价格的基础上减免给定的 discount%,并更新该单词到句子中。所有更新后的价格应该表示为一个恰好保留小数点后两位的数字。

示例

示例 1:

  • 输入: sentence = "there are $1 $2 and 5$ candies in the shop", discount = 50
  • 输出: "there are $0.50 $1.00 and 5$ candies in the shop"

示例 2:

  • 输入: sentence = "1 2 $3 4 $5 $6 7 8$ $9 $10$", discount = 100
  • 输出: "1 2 $0.00 4 $0.00 $0.00 7 8$ $0.00 $10$"

提示

  • 1 <= sentence.length <= 105
  • sentence 由小写英文字母、数字、’ ’ 和 ‘$’ 组成
  • sentence 不含前导和尾随空格
  • sentence 的所有单词都用单个空格分隔
  • 所有价格都是正整数且不含前导零
  • 所有价格最多为10位数字
  • 0 <= discount <= 100

解决方案

我们需要遍历整个句子,并检查每个单词是否是一个价格。如果是价格,则计算折扣后的新价格并替换原来的价格。以下是实现步骤:

  1. 遍历句子:使用指针遍历句子,查找每个价格单词。
  2. 判断是否为价格:判断单词是否以 $ 开头,且其后跟随的字符是数字。
  3. 计算折扣:对价格进行折扣计算,并格式化为保留两位小数。
  4. 构建新句子:将处理后的句子重新拼接起来。
    很烦,很多特殊处理,像上班处理需求一样。

代码实现

#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>char* discountPrices(char* sentence, int discount) {size_t len = strlen(sentence);// 为结果分配足够大的内存,防止只有一个'$'+一位数的情况导致溢出char* result = malloc(len * 3);if (result == NULL) {return NULL;}char* res_ptr = result;char* p = sentence;while (p < sentence + len) {// 查找下一个 '$' 符号char* price = strstr(p, "$");if (price) {// 将 '$' 之前的文本复制到结果中while (p < price) {*res_ptr++ = *p++;}// 检查 '$' 后的字符是否是数字if (price > sentence && *(price - 1) != ' ') {// 如果 '$' 前面的字符不是空格,将 '$' 复制到结果中并继续*res_ptr++ = *price++;p = price;continue;}if (!isdigit(*(price + 1))) {// 如果 '$' 后的字符不是数字,直接复制 '$' 并继续*res_ptr++ = *p++;continue;}// 提取并处理价格p = price + 1;double double_price = 0;char* end_of_price = p;while (isdigit(*end_of_price) || *end_of_price == '.') {end_of_price++;}// 检查价格是否紧跟非数字字符,如果是,则复制原始文本并继续if (*end_of_price != ' ' && *end_of_price != '\0') {while (price < end_of_price) {*res_ptr++ = *price++;}p = end_of_price;continue;}char original_price[20] = {0};strncpy(original_price, price, end_of_price - price);original_price[end_of_price - price] = '\0'; // 将复制的字符串以 '\0' 结尾sscanf(original_price, "$%lf", &double_price);if (double_price == 0) {// 如果价格为 0,直接复制原始文本并继续p = end_of_price;while (*p && *p != ' ') {*res_ptr++ = *p++;}continue;}// 计算折扣后的价格double_price *= (1 - discount / 100.0);// 格式化新的价格字符串char new_price[20] = {0};sprintf(new_price, "$%.2f", double_price);size_t new_price_len = strlen(new_price);// 将新的价格复制到结果缓冲区memcpy(res_ptr, new_price, new_price_len);res_ptr += new_price_len;p = end_of_price;} else {// 如果没有找到更多的价格,将剩余的文本复制到结果中while (*p) {*res_ptr++ = *p++;}break;}}*res_ptr = '\0';// 如果结果字符串长度小于等于原句子长度,将结果复制回原句子缓冲区if (strlen(result) <= len) {strcpy(sentence, result);free(result);return sentence;} else {// 如果结果过长,重新分配内存并返回新的缓冲区char* new_sentence = realloc(sentence, strlen(result) + 1);if (new_sentence == NULL) {printf("realloc failed");return NULL;}strcpy(new_sentence, result);free(result);return new_sentence;}
}

详细解析

  1. 内存分配

    • result 分配了 len * 3 的内存空间,以确保处理后的字符串有足够的空间存储。
  2. 查找价格单词

    • 使用 strstr 查找 $ 符号,判断其后是否跟随数字。
  3. 处理价格单词

    • 提取价格部分并进行折扣计算,结果保留两位小数。
    • 处理非价格部分的单词,直接复制到结果中。
  4. 字符串拼接

    • 将处理后的字符串拼接起来,并根据结果长度选择合适的缓冲区返回。

复杂度分析

  • 时间复杂度:O(n),其中 n 为字符串长度,需要遍历每个字符。
  • 空间复杂度:O(n),用于存储处理后的字符串。

结果

在这里插入图片描述

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

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

相关文章

工具链 之 Vite 常见的共享选项配置(二)

这些配置通常包括插件、别名、CSS 预处理器设置。 1. 插件&#xff08;Plugins&#xff09; 插件是 Vite 生态系统中的核心部分&#xff0c;用于扩展 Vite 的功能。一些插件&#xff08;如 vitejs/plugin-vue 对于 Vue 项目&#xff09;是项目所必需的&#xff0c;并且在所有环…

原生APP开发的技术难点

原生APP开发是一项复杂的技术工作&#xff0c;需要掌握多种编程语言和技术。原生APP开发的技术难点主要体现在以下几个方面&#xff0c;原生APP开发是一项技术难度较高的工作&#xff0c;需要开发者具备扎实的编程基础和丰富的开发经验。北京木奇移动技术有限公司&#xff0c;专…

Pycharm怎么默认终端连接远程服务器

因为经常需要从宿舍到学校内通勤&#xff0c;期间所有连接都会中断&#xff0c;所以每次开SSH特别麻烦&#xff0c;每次终端自动切换到本地&#xff1a; 每次都得点一下Start SSH Session 想要默认终端连接远程服务器&#xff0c;需要点File->Setting->Tools->SSH T…

Python - 一个恶意脚本

Python - 恶意脚本 使用此脚本或修改前请注意以下几点&#xff1a; 系统资源&#xff1a;大量模拟键盘和鼠标事件可能会占用大量系统资源&#xff0c;会导致其他应用程序运行缓慢或崩溃。 隐私和安全&#xff1a;如果此脚本在未经用户同意的情况下运行&#xff0c;它可能侵犯…

铺地地毯B1级防火检测 隔断板A1阻燃测试 氧指数检测

铺地地毯B1级防火检测 铺地地毯的B1级防火检测是指按照国家标准GB 8624-2012《建筑材料及制品燃烧性能分级》进行的测试&#xff0c;该标准将建筑材料及制品的燃烧性能分为A、B1、B2、B3四个等级。B1级表示难燃材料&#xff0c;具有较好的阻燃作用&#xff0c;在空气中遇明火或…

泛微E9开发 查询页面添加按钮,完成特定功能

查询页面添加按钮&#xff0c;完成特定功能 1、关联知识&#xff08;查询页面实现新增按钮&#xff09;2、功能实现2.1. 点击按钮&#xff0c;输出选中的checkbox的值2.2. 点击按钮&#xff0c;打开一个自定义对话框 3、实现方法 1、关联知识&#xff08;查询页面实现新增按钮&…

如何在不降低网络安全防护的前提下,优化pcdn的流量清洗效率?

在不降低网络安全防护的前提下&#xff0c;优化PCDN的流量清洗效率是一个复杂但至关重要的任务。以下是一些建议&#xff0c;帮助您实现这一目标&#xff1a; 一&#xff0e;升级硬件与网络设备&#xff1a; 投资于高性能的硬件和网络设备&#xff0c;以确保流量清洗过程中的…

【最新鸿蒙应用开发】——总结鸿蒙ArkTS渲染机制

ArkTS三种渲染控制机制 ArkUI通过自定义组件的build()函数和builder装饰器中的声明式UI描述语句构建相应的UI。在声明式描述语句中开发者除了使用系统组件外&#xff0c;还可以使用渲染控制语句来辅助UI的构建&#xff0c;这些渲染控制语句包括控制组件是否显示的条件渲染语句…

【大数据】gRPC、Flink、Kafka 分别是什么?

1. gRPC gRPC&#xff08;Google Remote Procedure Call&#xff09;是一个高性能、开源的远程过程调用&#xff08;RPC&#xff09;框架。它是由Google开发的&#xff0c;支持多种编程语言&#xff0c;并且广泛应用于微服务架构中。以下是gRPC的一些关键特点&#xff1a; 多语…

低代码结合自研项目打包发布

nginx配置 #user nobody; worker_processes 1;#error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info;#pid logs/nginx.pid;events {worker_connections 1024; }http {include mime.types;default_type applica…

麒麟Kylin | 操作系统的安装与管理

以下所使用的环境为&#xff1a;VMware Workstation 17 Pro、Kylin-Server-10-SP2-x86-Release-Build09-20210524 一、创建虚拟机 在VMware主机单击【创建新的虚拟机】 **在新建虚拟机向导中选择【自定义】&#xff0c;然后点击【下一步】 ** 保持默认选项&#xff0c;然后…

Vue 3 的 Teleport 组件实现跨层级通信

突破组件边界 - 使用 Vue 3 的 Teleport 组件实现跨层级通信 你可能已经熟悉了组件的基本概念:每个组件都是一个独立的单元,拥有自己的模板、样式和逻辑。但是,有时候我们需要在不同层级的组件之间进行交互,这就需要用到 Vue 3 中新引入的 Teleport 组件。 Teleport 组件可以…

CorelDRAW Graphics Suite下载2024最新版-CorelDRAW2024详细安装步骤

CorelDRAW​​ Graphics Suite官方版是款很多用户在工作中都会使用的矢量图形设计工具。CorelDRAW Graphics Suite正式版采用量身定制的界面和无与伦比的定制功能&#xff0c;畅享无缝设计经验。并且CorelDRAW Graphics Suite还可以广泛应用于商标设计、标志制作、模型绘制、插…

LangGraph自适应RAG

LangGraph自适应RAG 介绍索引LLMsweb 搜索工具graphgraph stategraph flowbuild graph执行 介绍 自适应 RAG 是一种 RAG 策略&#xff0c;它将 (1) 查询分析 (2) 主动/自校正 RAG 结合起来。 在文章中&#xff0c;他们报告了查询分析到路由获取&#xff1a; No RetrievalSing…

采用PHP语言(医院安全不良事件上报系统源码)医院不良事件 各类事件分析、分类、处理流程

医疗安全不容忽视&#xff01; 医疗安全&#xff08;不良&#xff09;事件是指在临床诊疗活动中以及医院运行过程中&#xff0c;任何可能影响患者的诊疗结果、增加患者的痛苦和负担并可能引发医疗纠纷或医疗事故&#xff0c;以及影响医疗工作的正常运行和医务人员人身安全的因…

什么是隐马尔可夫模型?

文章目录 一、说明二、玩具HMM&#xff1a;5′拼接位点识别三、那么&#xff0c;隐藏了什么&#xff1f;四、查找最佳状态路径五、超越最佳得分对齐六、制作更逼真的模型七、收获 关键词&#xff1a;hidden markov model 一、说明 被称为隐马尔可夫模型的统计模型是计算生物学…

libdrm 2.4.107 needed because amdgpu has the highest requirement

libdrm 2.4.107 needed because amdgpu has the highest requirement 1.问题分析解决 1.问题 Message: libdrm 2.4.107 needed because amdgpu has the highest requirement Run-time dependency libdrm_intel found: YES 2.4.107 Run-time dependency libdrm_amdgpu found: Y…

Day 25:1807. 替换字符串中的括号内容

Leetcode 1807. 替换字符串中的括号内容 给你一个字符串 s &#xff0c;它包含一些括号对&#xff0c;每个括号中包含一个 非空 的键。 比方说&#xff0c;字符串 “(name)is(age)yearsold” 中&#xff0c;有 两个 括号对&#xff0c;分别包含键 “name” 和 “age” 。 你知道…

Ansible介绍

一、Ansible概述 Ansible是一款开源的自动化运维工具&#xff0c;基于Python开发&#xff0c;主要用于批量系统配置、批量程序部署、批量运行命令等功能。它集合了众多运维工具的优点&#xff0c;并通过其高度模块化的特性&#xff0c;实现了灵活、可扩展的自动化运维管理。 …

ICMAN触摸芯片握手感应演示

随着科学技术的不断发展&#xff0c;触摸芯片在我们的生活中开始扮演着越来越多同时也越来越重要的角色&#xff0c;大到工业设备小到家用电器中都能找到它的身影。 相信大家都很好奇触摸芯片到底是怎样一个神奇的存在呢&#xff1f;那我们就来一探究竟。 要了解触摸芯片&…