数字字符串格式化
问题描述
小M在工作时遇到了一个问题,他需要将用户输入的不带千分位逗号的数字字符串转换为带千分位逗号的格式,并且保留小数部分。小M还发现,有时候输入的数字字符串前面会有无用的 0,这些也需要精简掉。请你帮助小M编写程序,完成这个任务。
通俗的话就是:
将输入的字符串转为 小数点前加入千分位逗号,在小数点后保持不变 的格式。并且去除前导零
测试样例
样例1: 输入:s = "1294512.12412" 输出:'1,294,512.12412'
做题思路
算法步骤
我的个人思路:while + stack + string + reverse
- 字符串的前导零处理:使用
while循环来遍历最后一个前导零的下标, - 栈的使用:使用C++中的
std::stack,因为我们需要处理小数点前的整数的千分位逗号,但我们是从前往后遍历的,所以可以让有效字符存入到栈里面,以便之后的处理 - 字符串拼接:C++中的
append方法我们发现小数点之后的数字是格式不变的,因此只要找到小数点的下标后面的字符可以直接拼接 - 此时我们可以调用栈里面的值,每三位进行加上
, - 字符串反转:调用C++中的
reverse方法,以便完成小数点前面的格式处理 - 合并结果:将处理后的整数部分和小数部分重新合并成一个字符串。
下面展示我使用豆包MarsCode AI刷题的步骤
问题理解
我们需要将一个不带千分位逗号的数字字符串转换为带千分位逗号的格式,并且保留小数部分。同时,如果输入的数字字符串前面有无效的零,这些零也需要被精简掉。
数据结构选择
我们可以使用字符串来处理这个问题,因为字符串操作在Java中非常方便。
算法步骤
- 去除前导零:首先,我们需要去除输入字符串前面的无效零。可以使用
Double.parseDouble将字符串转换为数字,然后再转换回字符串,这样可以自动去除前导零。 - 分离整数部分和小数部分:将字符串分为整数部分和小数部分。可以使用
split("\.")方法来实现。 - 格式化整数部分:对整数部分进行千分位格式化。可以从后往前每三位插入一个逗号。
- 合并整数部分和小数部分:将格式化后的整数部分和小数部分重新合并成一个字符串。
我发现豆包MarsCode AI,十分方便,还可以分析时间、空间复杂度
以下是他的解答: 整个算法的时间复杂度主要由以下几个部分决定:
Double.parseDouble(input)和Double.toString(doubleValue)的时间复杂度是 O(n)。split("\.")的时间复杂度是 O(n)。- 格式化整数部分的时间复杂度是 O(n)。
- 合并整数部分和小数部分的时间复杂度是 O(n)。 因此,整个算法的时间复杂度是 O(n),其中 n 是输入字符串的长度。
空间复杂度分析
- 我们使用了
StringBuilder来存储格式化后的整数部分,这需要 O(n) 的空间。 - 其他变量如
parts数组和decimalPart字符串也需要 O(n) 的空间。
因此,整个算法的空间复杂度也是 O(n)。
结论
这个算法的时间复杂度和空间复杂度都是 O(n),其中 n 是输入字符串的长度。这个复杂度是合理的,因为我们需要遍历整个字符串来进行格式化操作。
针对这次的刷题我感受到豆包的高效之处,下面介绍一下我的刷题学习方法:
1. 制定刷题计划
- 学习建议:对于入门的同学,理解并掌握数据排序和索引是非常重要的。可以通过不同题目的练习,逐步积累经验,提高处理数据的能力。
- 利用豆包MarsCode的AI刷题功能,根据个人的学习进度和能力水平,智能推荐适合的题目进行练习。
- 结合个人的时间安排,制定一个明确的学习计划,每天或每周安排一定的时间用于刷题。
2. 利用豆包MarsCode AI刷题
- 利用豆包MarsCode的AI推荐系统,找到适合你当前水平的题目。
- 对于每个题目,先尝试自己解决,然后查看AI提供的思路和代码示例,逐步理解和掌握解题方法。
- 对于重要的题目,进行多遍练习,加深理解和记忆。
3. 错题的针对性学习
- 将做错的题目记录下来,分析错误原因,是理解问题、算法应用还是代码实现的问题。
- 针对错题涉及的知识点进行复习,强化薄弱环节。
- 在一段时间后重做错题,检验是否真正掌握了相关知识点。
- 对于错题,尝试找出类似的题目进行练习,做到举一反三。
工具运用
豆包MarsCode不仅是一个工具,更是现代软件开发中不可或缺的助手,它的出现推动了开发工具的技术进步,并为开发者们带来了全新的开发体验和工作方式