2288. 价格减免

news2024/12/30 2:44:04

题目

给定一个字符串列表 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.coloradmin.cn/o/1834520.html

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

相关文章

2023数A题——WLAN网络信道接入机制建模

A题——WLAN网络信道接入机制建模 思路&#xff1a;该题主要考察的WLAN下退避机制建模仿真。 资料获取 问题1&#xff1a; 假设AP发送包的载荷长度为1500Bytes&#xff08;1Bytes 8bits&#xff09;&#xff0c;PHY头时长为13.6μs&#xff0c;MAC头为30Bytes&#xff0c;MA…

上海科技博物馆超薄OLED柔性壁纸屏应用方案

产品&#xff1a;2组55寸OLED柔性屏2x1 特点&#xff1a;嵌入墙体&#xff0c;与空间装饰融入一体 用途&#xff1a;播放文物展示 一、项目背景 上海科技博物馆作为展示科技与文化的交汇点&#xff0c;一直致力于为观众提供沉浸式的参观体验。为了提升文物展示的现代化和科技感…

不可忽视的9条网页排版设计规则,你了解吗?

网页设计由95%的排版组成。网页排版设计使图形的放置栩栩如生&#xff0c;让用户保持愉悦&#xff0c;容易被用户视觉感知。在这个过程中&#xff0c;网页排版设计需要考虑很多因素:款式、大小、字体颜色等。此外&#xff0c;设计师通过网页排版&#xff0c;让文字增加设计的美…

Kafka 高性能 7 大秘诀之 Segment 消息存储机制的奥妙

《Kafka 高性能 7 大秘诀》第 4 篇&#xff0c;解密 kafka Segment 日志存储思想哲学以及如何将磁盘的随机读写变成顺序读写&#xff0c;提高磁盘读写速度。 Kafka 使用日志文件存储消息&#xff0c;每个 Partition 的消息被存储在多个 Segment 文件中&#xff0c;避免了单个文…

经典神经网络(11)VQ-VAE模型及其在MNIST数据集上的应用

经典神经网络(11)VQ-VAE模型及其在MNIST数据集上的应用 我们之前已经了解了PixelCNN模型。 经典神经网络(10)PixelCNN模型、Gated PixelCNN模型及其在MNIST数据集上的应用 今天&#xff0c;我们了解下DeepMind在2017年提出的一种基于离散隐变量&#xff08;Discrete Latent va…

OneNote 作为恶意软件分发新渠道持续增长

目前&#xff0c;Office 文件已经默认禁用宏代码&#xff0c;攻击者开始转向利用其他微软的软件产品来进行恶意 Payload 投递。默认情况下&#xff0c;OneNote 应用也包含在 Office 2019 和 Microsoft 365 软件中&#xff0c;所以 OneNote 文件越来越受到攻击者的青睐。如果有人…

调度算法-内存页面置换算法

缺⻚异常&#xff08;缺⻚中断&#xff09; 与⼀般中断的主要区别在于&#xff1a; 缺⻚中断在指令执⾏「期间」产⽣和处理中断信号&#xff0c;⽽⼀般中断在⼀条指令执⾏「完成」后检查和处理中断信号。缺⻚中断返回到该指令的开始重新执⾏「该指令」&#xff0c;⽽⼀般中断返…

如何完美解决 Oracle Database 19c 安装程序 - 第7步(共8步)卡住,半小时都不动

&#x1f680; 如何完美解决 Oracle Database 19c 安装程序 - 第7步&#xff08;共8步&#xff09;卡住&#xff0c;半小时都不动 摘要 在安装 Oracle Database 19c 时&#xff0c;很多用户会在第7步&#xff08;共8步&#xff09;遇到卡住的问题&#xff0c;尤其是安装程序长…

ESP32蓝牙串口通讯

文章目录 一、前言二、代码三、运行 一、前言 ESP32支持经典蓝牙和低功耗蓝牙&#xff08;BLE&#xff09;,经典蓝牙可在计算机上模拟出一个串口&#xff0c;使得ESP32可以以串口的方式和计算机通信。 二、代码 #include "BluetoothSerial.h"String device_name …

Upload-Labs-Linux1 使用 一句话木马

解题步骤&#xff1a; 1.新建一个php文件&#xff0c;编写内容&#xff1a; <?php eval($_REQUEST[123]) ?> 2.将编写好的php文件上传&#xff0c;但是发现被阻止&#xff0c;网站只能上传图片文件。 3.解决方法&#xff1a; 将php文件改为图片文件&#xff08;例…

目标检测顶会新成果!20个突破性方法,更高性能,更强理解与分析能力!

【目标检测】在近年来的深度学习领域中备受关注&#xff0c;它通过识别和定位图像中的目标对象&#xff0c;提升了模型在图像理解和分析方面的能力。目标检测技术在自动驾驶、安防监控和医疗影像分析等任务中取得了显著成果。其独特的方法和卓越的表现使其成为研究热点之一。 为…

面试经典150题

打家劫舍 class Solution { public:int rob(vector<int>& nums) {int n nums.size();if(n 1){return nums[0];}vector<int> dp(n, 0);dp[0] nums[0];//有一间房可以偷//有两间房可以偷if(nums[1] > nums[0]){dp[1] nums[1];}else{dp[1] nums[0];}for …

MySQL----InooDB行级锁、间隙锁

行级锁 行锁&#xff0c;也称为记录锁&#xff0c;顾名思义就是在记录上加的锁。 注意&#xff1a; InnoDB行锁是通过给索引上的索引项加锁来实现的&#xff0c;而不是给表的行记录加锁实现的&#xff0c;这就意味着只有通过索引条件检索数据&#xff0c;InnoDB才使用行级锁…

电商API接口是什么意思?有什么作用?

电商API接口是电子商务领域中一种技术解决方案&#xff0c;它允许不同的软件系统之间进行交互和数据交换。 在电商场景下&#xff0c;电商API接口可以实现的功能非常丰富&#xff0c;例如&#xff1a; 商品管理&#xff1a;获取商品列表、商品详情、搜索商品、上下架商品等&a…

vue页面前端初始化表格数据时报错TypeError: data.reduce is not a function

这是初始化表格数据时报的错 。 [Vue warn]: Invalid prop: type check failed for prop "data". Expected Array, got Object found in---> <ElTable> at packages/table/src/table.vue<List> at src/views/org/List.vue<Catalogue> at src/v…

lombok不起作用排查

1.idea中lombok插件已安装并启用 2.idea中annotation processors已勾选 3.项目中gradle或maven已引入lombok依赖 但提示还是找不到get,set方法。 还需要启用annotationProcessor 重点是annotationProcessor的配置&#xff0c;没有配置这个才是问题出现的关键&#xff01;&…

四川古力未来科技有限公司抖音小店解锁电商新机遇

在数字化浪潮席卷全球的今天&#xff0c;电商行业正以前所未有的速度蓬勃发展。四川古力未来科技有限公司紧跟时代步伐&#xff0c;积极拥抱变革&#xff0c;在抖音平台上开设小店&#xff0c;为品牌发展注入了新的活力。那么&#xff0c;四川古力未来科技有限公司抖音小店究竟…

6.S081——CPU调度部分(Xv6中的进程的状态转换)——xv6源码完全解析系列(11)

0.briefly speaking 时隔9个月&#xff0c;我又回来继续更新Xv6内核源码相关的内容了&#xff0c;上次更新之后经历了3个月的秋招&#xff0c;之后紧接着是实验室的中期检查&#xff0c;之后又是遥遥无期的毕业论文写作和修改&#xff0c;总算到现在有了一些自己的时间来继续做…

Kotlin 实战小记:No-Arg 引用解决 No constructor found的问题

一、问题 新的项目试用一下kotlin, 调用数据库查询数据的时候报了这个问题&#xff1a;org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.executor.ExecutorException: No constructor found in com.neusoft.collect.entity.cm.CmRoom matc…

AMEYA360代理品牌 | 思瑞浦发布高精度12位8通道SAR ADC-TPC502200

聚焦高性能模拟芯片和嵌入式处理器的半导体供应商思瑞浦3PEAK(股票代码&#xff1a;688536)全新推出TPC502200&#xff0c;支持I2C接口的12位8通道SAR ADC。 TPC502200集成了高精度基准源&#xff0c;同时可在极端温度范围(-40C至125C)下稳定工作。TPC502200凭借强大的性能优势…