问题理解
小M需要将一个不带千分位逗号的数字字符串转换为带千分位逗号的格式,并且保留小数部分。此外,输入的数字字符串可能包含前导的无效 0,这些 0 需要被去除。
数据结构选择
- 字符串:由于我们需要处理字符串的格式化,字符串是最直接的数据结构。
- StringBuilder:在处理字符串拼接时,
StringBuilder比直接使用字符串拼接更高效。
算法步骤
- 去除前导零:首先需要去除输入字符串中的前导零。
- 分离整数部分和小数部分:将字符串分为整数部分和小数部分。
- 格式化整数部分:对整数部分进行千分位逗号的插入。
- 合并整数部分和小数部分:将格式化后的整数部分和小数部分重新合并。
具体步骤
-
去除前导零:
- 使用
String.replaceFirst("^0+(?!$)", "")来去除前导零。
- 使用
-
分离整数部分和小数部分:
- 使用
String.split("\.")来分离整数部分和小数部分。
- 使用
-
格式化整数部分:
- 从整数部分的末尾开始,每隔三位插入一个逗号。
-
合并整数部分和小数部分:
- 如果存在小数部分,将其与格式化后的整数部分用
.连接。
- 如果存在小数部分,将其与格式化后的整数部分用
通过以上步骤,可以实现将不带千分位逗号的数字字符串转换为带千分位逗号的格式,并且保留小数部分。
题目理解
题目要求我们从一组数字中选择一个数字,使得这些数字的各位数字之和为偶数。我们需要计算出有多少种不同的分组和选择方法可以达到这一目标。
数据结构选择
- 输入是一个由多个整数字符串组成的列表,每个字符串可以视为一个数字组。
- 我们需要从每个数字组中选择一个数字。
算法步骤
-
初始化计数器:
evenWays表示当前已经形成的偶数和的组合数。oddWays表示当前已经形成的奇数和的组合数。
-
遍历每个数字组:
- 对于每个数字组,统计其中偶数和奇数的个数。
- 使用动态规划的思想,更新
evenWays和oddWays。
-
动态规划更新:
- 如果当前数字组中选择一个偶数,那么新的偶数和组合数为
evenWays * 当前组偶数个数 + oddWays * 当前组奇数个数。 - 如果当前数字组中选择一个奇数,那么新的奇数和组合数为
oddWays * 当前组偶数个数 + evenWays * 当前组奇数个数。
- 如果当前数字组中选择一个偶数,那么新的偶数和组合数为
-
返回结果:
- 最终返回
evenWays,即能够形成偶数和的组合数。
- 最终返回
总结
通过动态规划的方法,我们可以有效地计算出有多少种不同的分组和选择方法可以达到目标。这个方法的时间复杂度为 O(n * m),其中 n 是数字组的数量,m 是每个数字组的长度。