Help the bookseller
题目描述
A bookseller has lots of books classified in 26 categories labeled A, B, ... Z. Each book has a code c of 3, 4, 5 or more capitals letters. The 1st letter of a code is the capital letter of the book category. In the bookseller\'s stocklist each code c is followed by a space and by a positive integer n (int n >= 0) which indicates the quantity of books of this code in stock.
题目的例子
L = {\"ABART 20\", \"CDXEF 50\", \"BKWRK 25\", \"BTSQZ 89\", \"DRTYM 60\"}or
L = [\"ABART 20\", \"CDXEF 50\", \"BKWRK 25\", \"BTSQZ 89\", \"DRTYM 60\"]
M = {\"A\", \"B\", \"C\", \"W\"}or
M = [\"A\", \"B\", \"C\", \"W\"]
return (A : 20) - (B : 114) - (C : 50) - (W : 0)
题目大意:大概是说书店的书籍分类为26个字母A~Z开头,L里面每一个元素的第一个大写字母是书籍的分类,后面的数字是该类书籍的数量,如\"ABART 20\",A类书籍是20本,M说明的是要计算这类书的数量,如M中的B类数对应例子中的\"BKWRK 25\", \"BTSQZ 89\",共有114本,输出格式为(x : 数量) - (x : 数量)....
实现思路
利用map数据结构来存储结果,StringBuffer进行后面的字符串拼接,对lstOfArt字符串数组即例子中的L进行遍历,截取每个字符的开头,即书籍的分类,截取空格后的数字,代表该类书籍的数量,判断map当中时候包含该书籍分类的键值了,存在就进行该类书籍数目的累加,最后在更新map里面的数据,不存在就直接添加。然后对lstOf1stLetter即例子中的M进行遍历,与map里面的键进行匹配,匹配到就直接添加到StringBuffer里面,格式\"(\"+s+\" : \"+map.get(s)+\") - \",匹配不到的格式为\"(\"+s+\" : \"+0+\") - \",并添加到StringBuffer,最后对StringBuffer转换成字符串并且要进行截取,因为后面有多余的字符串“空格-空格”。
实现代码
import java.util.*;
public class StockList {
// 1st parameter is the stocklist (L in example),
// 2nd parameter is list of categories (M in example)
public static String stockSummary(String[] lstOfArt, String[] lstOf1stLetter) {
if(lstOfArt.length==0||lstOf1stLetter.length==0)return \"\";
Map<String,Integer> map=new HashMap<String,Integer>();
StringBuffer sb=new StringBuffer();
for(String str:lstOfArt){
String c=str.substring(0,1).toString();
int num=Integer.parseInt(str.substring(str.indexOf(\" \")+1,str.length()));
if(map.containsKey(c)){
num+=map.get(c);
}
map.put(c,num);
}
for(String s:lstOf1stLetter){
if(map.get(s)==null){
sb.append(\"(\"+s+\" : \"+0+\") - \");
}
else sb.append(\"(\"+s+\" : \"+map.get(s)+\") - \");
}
return sb.toString().substring(0,sb.length()-3);
}
}
优秀coder的code
import java.util.stream.Stream;
import java.util.stream.Collectors;
public class StockList {
public static String stockSummary(String[] arts, String[] cats) {
if (arts.length == 0) return \"\";
final int space = arts[0].indexOf(\" \");
return Stream.of(cats)
.map(c -> c + \" : \" + Stream.of(arts)
.filter(a -> c.contentEquals(a.subSequence(0, 1)))
.map(a -> a.substring(space + 1))
.mapToInt(Integer::parseInt)
.sum())
.map(s -> \"(\" + s + \")\")
.collect(Collectors.joining(\" - \"));
}
}
import java.util.Map;
import static java.util.Arrays.stream;
import static java.util.stream.Collectors.groupingBy;
import static java.util.stream.Collectors.summingInt;
import static java.util.stream.Collectors.joining;
public class StockList {
private static int stockCount(final String s) {
return Integer.valueOf(s.split(\" \")[1]);
}
public static String stockSummary(final String[] stock, final String[] categories) {
if (stock.length == 0 || categories.length == 0)
return \"\";
final Map<String, Integer> counts = stream(stock)
.collect(groupingBy(s -> s.substring(0, 1), summingInt(StockList::stockCount)));
return stream(categories)
.map(s -> \"(\" + s + \" : \" + counts.getOrDefault(s, 0) + \")\")
.collect(joining(\" - \"));
}
}
版权声明
本文仅代表作者观点,不代表百度立场。
本文系作者授权百度百家发表,未经许可,不得转载。




