Description : Given an array (arr) as an argument complete the function countSmileys that should return the total number of smiling faces.
Rules for a smiling face:
-Each smiley face must contain a valid pair of eyes. Eyes can be marked as : or ;
-A smiley face can have a nose but it does not have to. Valid characters for a nose are - or ~
-Every smiling face must have a smiling mouth that should be marked with either ) or D.
No additional characters are allowed except for those mentioned.
Valid smiley face examples: :) :D ;-D :~)
Invalid smiley faces: ;( :> :} :]
Example cases:
countSmileys([‘:)’, ‘;(‘, ‘;}’, ‘:-D’]); // should return 2;
countSmileys([‘;D’, ‘:-(‘, ‘:-)’, ‘;~)’]); // should return 3;
countSmileys([‘;]’, ‘:[‘, ‘;*’, ‘:$’, ‘;-D’]); // should return 1;
Note: In case of an empty array return 0. You will not be tested with invalid input (input will always be an array)
Happy coding!
解法一:
public static int countSmileys(List<String> arr) {
if (arr == null) return 0;
int num = 0;
for(String i : arr){
char[] item = i.toCharArray();
Map<String,Integer> map = new HashMap<String,Integer>();
for(char m : item){
if(map.containsKey(String.valueOf(m))){
map.put(String.valueOf(m), map.get(String.valueOf(m))+1);
}else{
map.put(String.valueOf(m), 1);
}
}
int nums = 0;
if(map.containsKey(")")){
nums += map.get(")");
}
if(map.containsKey("D")){
nums += map.get("D");
}
if(map.containsKey(";")){
nums += map.get(";");
}
if(map.containsKey(":")){
nums += map.get(":");
}
if(map.containsKey("-")){
nums += map.get("-");
}
if(map.containsKey("~")){
nums += map.get("~");
}
if (nums == item.length){
int a = 0;
int b = 0;
if(map.containsKey(")")){
a += map.get(")");
}
if(map.containsKey("D")){
a += map.get("D");
}
if(map.containsKey(";")){
b += map.get(";");
}
if(map.containsKey(":")){
b += map.get(":");
}
if (a>0 && b>0){
num++;
}
}else{
continue;
}
}
return num;
}
@Test
public void test1() {
List<String> a = new ArrayList<String>();
a.add(":)"); a.add(":D"); a.add(":-}"); a.add(":-()");
assertEquals(2, SmileFaces.countSmileys(a));
}
@Test
public void test0() {
List<String> a = new ArrayList<String>();
a.add(":)"); a.add(":D"); a.add(":-}"); a.add(":-()");
assertEquals(2, SmileFaces.countSmileys(a));
}
@Test
public void test2() {
List<String> a = new ArrayList<String>();
a.add(":)"); a.add("XD"); a.add(":0}"); a.add("x:-"); a.add("):-"); a.add("D:");
assertEquals(3, SmileFaces.countSmileys(a));
}
@Test
public void test4() {
List<String> a = new ArrayList<String>();
a.add(":)"); a.add(":D"); a.add("X-}"); a.add("xo)"); a.add(":X"); a.add(":-3"); a.add(":3");
assertEquals(2, SmileFaces.countSmileys(a));
}
@Test
public void test5() {
List<String> a = new ArrayList<String>();
a.add(":)"); a.add(":)"); a.add("x-]"); a.add(":ox"); a.add(";-("); a.add(";-)"); a.add(";~("); a.add(":~D");
assertEquals(4, SmileFaces.countSmileys(a));
}
这种方法使用了最笨的方式,效果也不太好。性能很差,不是很推荐。
解法二:使用正则表达式,对于字符串的一些判断使用正则效率很高。