面试题07:Count the smiley faces!

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));
  }

这种方法使用了最笨的方式,效果也不太好。性能很差,不是很推荐。

解法二:使用正则表达式,对于字符串的一些判断使用正则效率很高。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值