字节青训-数字字符串格式化

问题描述

小M在工作时遇到了一个问题,他需要将用户输入的不带千分位逗号的数字字符串转换为带千分位逗号的格式,并且保留小数部分。小M还发现,有时候输入的数字字符串前面会有无用的 0,这些也需要精简掉。请你帮助小M编写程序,完成这个任务。

测试样例

样例1:

输入:s = "1294512.12412"
输出:'1,294,512.12412'

样例2:

输入:s = "0000123456789.99"
输出:'123,456,789.99'

样例3:

输入:s = "987654321"
输出:'987,654,321'

 

解题思路:

问题理解

我们需要将一个不带千分位逗号的数字字符串转换为带千分位逗号的格式,并且保留小数部分。此外,输入的字符串可能包含前导零,这些前导零需要被去除。

数据结构选择

  • 我们可以使用字符串来处理输入和输出,因为字符串操作在处理文本格式时非常方便。

算法步骤

  1. 去除前导零:首先,我们需要去除字符串中的前导零。可以使用 std::stod 将字符串转换为双精度浮点数,然后再转换回字符串,这样可以自动去除前导零。
  2. 分割整数和小数部分:将字符串分割为整数部分和小数部分。可以使用 std::find 找到小数点的位置,然后分别处理整数和小数部分。
  3. 格式化整数部分:对整数部分进行格式化,每三位插入一个逗号。可以使用一个循环从后向前遍历整数部分,每三位插入一个逗号。
  4. 合并结果:将格式化后的整数部分和小数部分合并,形成最终的结果。

 第一版代码:

为什么这个叫第一版,自然是因为它过不了

#include <bits/stdc++.h>
#include <string>using namespace std;std::string solution(const std::string& s) {// 去除前导零double num = stod(s);// cout<<num;string cleanedStr = to_string(num);// cout<<cleanedStr<<endl;// 分割整数和小数部分size_t dotPos = cleanedStr.find('.');string integerPart = cleanedStr.substr(0, dotPos);string decimalPart = cleanedStr.substr(dotPos);// 格式化整数部分string formattedIntegerPart;int count = 0;for (int i = integerPart.size() - 1; i >= 0; --i) {formattedIntegerPart = integerPart[i] + formattedIntegerPart;count++;if (count % 3 == 0 && i != 0) {formattedIntegerPart = ',' + formattedIntegerPart;}}// cout<<formattedIntegerPart<<endl<<decimalPart;// 合并结果return formattedIntegerPart + decimalPart;
}int main() {std::cout << (solution("1294512.12412") == "1,294,512.12412") << std::endl;std::cout << (solution("0000123456789.99") == "123,456,789.99") << std::endl;std::cout << (solution("987654321") == "987,654,321") << std::endl;
}

问题分析:

这里的问题在于:当我用stod函数转化成num变量时,这个数字会在小数后面默认补全到6位,再转回到string的时候就会多出零来。

 解决方法:

我在中间对小数部分用一个循环去除末尾的0

while (decimalPart.size() > 1 && decimalPart.back() == '0') {decimalPart.pop_back();}

 优化处理:考虑到有些数字的小数位数会大于double的精度范围,所以思路有一定改进

最终代码:

#include <bits/stdc++.h>
#include <string>using namespace std;std::string solution(const std::string& s) {// 去除前导零size_t start = 0;while (start < s.size() && s[start] == '0') {start++;}string cleanedStr = s.substr(start);// 分割整数和小数部分size_t dotPos = cleanedStr.find('.');string integerPart = (dotPos == string::npos) ? cleanedStr : cleanedStr.substr(0, dotPos);string decimalPart = (dotPos == string::npos) ? "" : cleanedStr.substr(dotPos);// 去除小数部分多余的零while (decimalPart.size() > 1 && decimalPart.back() == '0') {decimalPart.pop_back();}// 格式化整数部分string formattedIntegerPart;int count = 0;for (int i = integerPart.size() - 1; i >= 0; --i) {formattedIntegerPart = integerPart[i] + formattedIntegerPart;count++;if (count % 3 == 0 && i != 0) {formattedIntegerPart = ',' + formattedIntegerPart;}}// 合并结果return formattedIntegerPart + decimalPart;
}int main() {std::cout << (solution("1294512.12412") == "1,294,512.12412") << std::endl;std::cout << (solution("0000123456789.99") == "123,456,789.99") << std::endl;std::cout << (solution("987654321") == "987,654,321") << std::endl;
}

运行结果:

 

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

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

相关文章

HER304-ASEMI轴向高效恢复二极管HER304

编辑&#xff1a;ll HER304-ASEMI轴向高效恢复二极管HER304 型号&#xff1a;HER304 品牌&#xff1a;ASEMI 封装&#xff1a;DO-27 特性&#xff1a;轴向高效恢复二极管 正向电流&#xff1a;3A 反向耐压&#xff1a;300V 恢复时间&#xff1a;35ns 引脚数量&#xf…

信息宣传投稿栽跟头不可怕,关键是你要能再站起来

在繁忙的市郊,一家的事业基层单位,这里汇聚了各路英才,每个科室都有自己的专长。然而,有一项任务,让这些精英们头疼不已——单位信息宣传投稿。 起初,大家对这项任务并不以为然,以为不过是小菜一碟。李科长甚至开玩笑说:“不就是写篇文章,投个稿嘛,我们这些笔杆子还怕这个?”…

iMeta | 复杂热图(ComplexHeatmap)可视化文章最新版,画热图就引它

复杂热图可视化 https://doi.org/10.1002/imt2.43 PROTOCOL ●2022年8月&#xff0c;德国癌症研究中心顾祖光在iMeta在线发表了题为“Complex heatmap visualization”的方法类文章。 ● 该研究系统性地介绍了 ComplexHeatmap R包在复杂热图可视化方面的特性和功能。 ● 第…

HTTP的了解

从输入 URL 到页面展示到底发生了什么&#xff1f;&#xff08;非常重要&#xff09; 类似的问题&#xff1a;打开一个网页&#xff0c;整个过程会使用哪些协议&#xff1f; 先来看一张图&#xff08;来源于《图解 HTTP》&#xff09;&#xff1a; 上图有一个错误需要注意&…

博弈论(所有情况最优解)——课堂笔记

博弈论(所有情况最优解)——课堂笔记|【博弈论】分割数游戏-CSDN博客https://blog.csdn.net/back_room/article/details/143464453?spm=1001.2014.3001.5501【博弈论】拍卖土地-CSDN博客

网络编程——TCP通信练习

目录 一、多发多收 二、接收和反馈 三、上传文件 四、解决上传文件名重复问题 五、上传文件多线程版 六、上传文件线程池版 七、B/S(接收浏览器的消息并打印) 一、多发多收 客户端&#xff1a;多次发送数据 服务器&#xff1a;接收多次数据&#xff0c;并打印 public cl…

Selenium自动化测试 —— 模拟鼠标键盘的操作事件

软件测试资料领取&#xff1a;[内部资源] 想拿年薪40W的软件测试人员&#xff0c;这份资料必须领取~ 软件测试面试刷题工具&#xff1a;软件测试面试刷题【800道面试题答案免费刷】 鼠标操作事件 在实际的web产品测试中&#xff0c;对于鼠标的操作&#xff0c;不单单只有clic…

线性回归模型

线性回归模型 代价函数 梯度下降 学习率 梯度下降的收敛与调优 梯度下降的收敛性依赖于以下因素&#xff1a; 学习率的选择&#xff1a;合适的学习率能够确保稳定收敛&#xff0c;过大或过小的学习率可能会导致收敛不稳定或效率低下。数据的特征&#xff1a;数据的规模和特征…

书生大模型基础岛第一关书生大模型全链路开源体系

本文档相当于是对书生*浦语的了解文档 官网&#xff1a; https://internlm.intern-ai.org.cn/ github: https://github.com/internLM/ 开源之路&#xff1a; 2023.7.6 InterLM-7B2023.9.20 InterLM-20B2024.1.17 InternLM22024.7.4 InternLM2.5 性能天梯&#xff1a; InternL…

01OpenGL基本学习

文章目录 第一节1、概念立即模式vs核心模式 2、问题 第二节1、三维坐标系![三维坐标系](https://i-blog.csdnimg.cn/direct/0703ba6b68914b08b1d14b936ccd862d.png)2、什么是模型&#xff1f;3、什么是颜色&#xff1f;4、材质 第三节渲染管线第四节GLAD配置流程1、为什么需要G…

测试-请求特定资源使用Postman工具(3)

目录 前言 实操 开发者工具 前言 介绍过&#xff0c;就不再介绍了&#xff0c;只需要知道它是一个网络请求的工具就行了 实操 开发者工具 这里我们还需要借助开发者工具来帮助我们进行资源的请求&#xff0c;这里用 百度一下 进行测试 如下是 百度一下 的首页 右键打开…

Foliate:沉浸式阅读!!!

项目简介 Foliate 是一款开源的电子书阅读器&#xff0c;专为现代操作系统设计&#xff0c;提供了优雅且实用的阅读体验。它支持多种电子书格式&#xff0c;包括 EPUB、Mobipocket、Kindle、FB2、CBZ 和 PDF&#xff0c;让用户能够以分页或滚动模式阅读。Foliate 允许用户自定义…

打包18款AI营销神器,批量运营项目收藏必备!

淘金的不如卖铲子的&#xff0c;AI工具的应用越来越普及&#xff0c;这也让很多原本淘金的人都来卖铲子。如果自己能有很好的铲子&#xff0c;自己也会淘金&#xff0c;就可以既能卖铲子赚钱&#xff0c;也能掏金赚钱。 还有两天就是双十一了&#xff0c;各种AI工具&#xff0…

【MyBatis源码】SQL 语句构建器AbstractSQL

文章目录 介绍org.apache.ibatis.jdbc.SQLSQL类使用示例SelectProvider搭配动态SQLAbstractSQL类源码分析 介绍 当我们需要使用Statement对象执行SQL时&#xff0c;SQL语句会嵌入Java代码中。SQL语句比较复杂时&#xff0c;我们可能会在代码中对SQL语句进行拼接&#xff0c;查…

Vue2进阶

1.el安装 官网地址 Element - The worlds most popular Vue UI frameworkElement&#xff0c;一套为开发者、设计师和产品经理准备的基于 Vue 2.0 的桌面端组件库https://element.eleme.cn/#/zh-CN 安装 npm install element-ui -S 引入组件&#xff08;在 main.js&#xf…

案例:三次锁定(下)

第二步: 在 Form1.cs 中完成以下代码 using Dome16_三次锁定.service; using Dome16_三次锁定.service.serviceimpl; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using Sys…

前端学习笔记—Vue3特性

一、 Vue3与Vite构建工具简介 image.png image.png image.png image.png Vite构建工具&#xff08;其他的打包工具有webpack&#xff0c;grunt&#xff0c;gulp&#xff09; image.png image.png 构建 二、创建Vue3项目 vite在TypeScript结合使用上&#xff0c;直接开箱即用&am…

iOS 去掉URL里面的百分号符号

遇到这个一段字符串 “publicId2030095197043302&publicBizTypeCONTENT_USER&chInfoch_life__chsub_Ndiscovery.featured&logoUrlhttps%3A%2F%2Fmdn.alipayobjects.com%2Fopen_content%2Fafts%2Fimg%2FA*_SUKQodfigcAAAAAAAAAAAAAfVx1AQ%2Foriginal&publicName…

node.js安装配置(Windows)

1、下载 CNPM Binaries Mirror 2、安装 3、验证 win R 进入cmd 4、配置环境变量 4.1、创建两个文件夹 4.2、安装目录进入cmd(配置全局属性) 配置两个命令&#xff1a; npm config set prefix "D:\liyunqing\nodejs\node_global"npm config set cache "D:\l…

jdbc中预防SQL攻击

目录 展示SQL攻击 举一个出现sql 攻击的例子 SQL攻击的原因 分析原因 阻止SQL攻击 PreparedStatement的含义 使用PreparedStatement的原因 步骤如下 注意 总结 展示SQL攻击 举一个出现sql 攻击的例子 假设我们在做登录业务时&#xff0c;思路是这样的&#xff1a; 首…