本文章是对官方题解的补充说明
原题链接:2288. 价格减免
思路
由题目中的“单词之间用单个空格分隔”和 “如果单词的形式为美元符号后跟着一个非负实数,那么这个单词就表示一个 价格 。”
可知:
首先要通过 ‘space’把原字符串进行切分,然后再通过判断每个子串的首字符是否为‘$’以及便利其中是否存在非数字字符来实现完整的代码。
而我存在的问题:
拆开好说但是如何合并呢?
class Solution {public String discountPrices(String sentence, int discount) {double d = 1 - discount / 100.0;// 先通过空格划分单词,再通过$符号寻找符合条件的价格,进而再操作String[] a = sentence.split(" ");for (int i = 0; i < a.length; i++ ) {if (check(a[i])) {a[i] = String.format("$%.2f", Long.parseLong(a[i].substring(1)) * d);}}return String.join(" ", a);}public boolean check(String str) {if (str.length() == 1 || str.charAt(0) != '$') {return false;}char[] s = str.toCharArray();for (int i = 1; i < s.length; i++ ) {if (!Character.isDigit(s[i])) {return false;}}return true;}
}
细节
Long.parseLong(String s)
-
作用:将字符串解析为
long
类型的整数。 -
使用场景:当你确定字符串表示一个有效的整数时,可以使用这个方法将字符串转换为
long
类型。 -
示例:
String numberStr = "12345"; long number = Long.parseLong(numberStr); // 结果为 12345
substring(int beginIndex)
-
作用:返回一个新的字符串,它是此字符串的子字符串。
-
使用场景:当你需要从字符串的某个特定位置开始提取子字符串时,可以使用这个方法。
-
示例:
String str = "$100"; String subStr = str.substring(1); // 结果为 "100"
Character.isDigit(char ch)
-
作用:确定指定的字符是否为数字字符。
-
使用场景:当你需要检查一个字符是否为数字时,可以使用这个方法。
-
示例:
char ch1 = '5'; boolean isDigit1 = Character.isDigit(ch1); // 结果为 truechar ch2 = 'a'; boolean isDigit2 = Character.isDigit(ch2); // 结果为 false
String.format(String format, Object... args)
-
作用:使用指定的格式字符串和参数返回格式化后的字符串。
-
使用场景:当你需要创建一个格式化字符串时,可以使用这个方法。常见的格式化占位符有
%d
(整数),%f
(浮点数),%s
(字符串) 等等。 -
示例:
double value = 1.2345; String formatted = String.format("%.2f", value); // 结果为 "1.23"
结合示例代码
在你的代码中,以下表达式:
a[i] = String.format("$%.2f", Long.parseLong(a[i].substring(1)) * d);
-
a[i].substring(1)
:提取单词中$
符号之后的部分,例如,将"$100"
转换为"100"
。 -
Long.parseLong(a[i].substring(1))
:将字符串"100"
解析为长整型数值100
。 -
Long.parseLong(a[i].substring(1)) * d
:将解析后的长整型数值乘以折扣系数d
,得到折扣后的价格。 -
String.format("$%.2f", ...)
:将折扣后的价格格式化为保留两位小数的字符串,并加上$
符号,例如,将50.0
转换为"$50.00"
。
代码分析
class Solution {public String discountPrices(String sentence, int discount) {double d = 1 - discount / 100.0;// 先通过空格划分单词,再通过$符号寻找符合条件的价格,进而再操作String[] a = sentence.split(" ");for (int i = 0; i < a.length; i++ ) {if (check(a[i])) {a[i] = String.format("$%.2f", Long.parseLong(a[i].substring(1)) * d);}}return String.join(" ", a);}public boolean check(String str) {if (str.length() == 1 || str.charAt(0) != '$') {return false;}char[] s = str.toCharArray();for (int i = 1; i < s.length; i++ ) {if (!Character.isDigit(s[i])) {return false;}}return true;}
}
-
check(a[i])
:检查单词是否是一个价格单词。首先确保单词长度大于1且以$
开头,然后检查$
之后的每个字符是否都是数字。 -
a[i] = String.format("$%.2f", Long.parseLong(a[i].substring(1)) * d);
:对于每个符合条件的价格单词,去掉$
符号,解析为长整型,计算折扣后价格,并格式化为保留两位小数的字符串。