携程2021春招笔试

携程2021春招面经

就2道算法题
因为第二题不会,要用AC自动机,没写过就放弃了。

第一题:为了寻找最佳拍档,我们定义两人名字的缘分值:两人名字左对齐后,对应位置字的拼音的缘分值之和。对于两个拼音s1、s2,通过剔除一些字符使得留下的子串一模一样,被剔除字符之和的最小值即为两个拼音的缘分值。求给定两人名字的缘分值。
提交的版本 过了67% 后来结束后发现忘记判断 name1="a" name2=" " 的情况

static int calcSimilarity2(String name1, String name2) {
    
          int res = 0;
     
          //先把所有的ASCII码加起来 减去2倍重复的
          for (int i = 0; i < name1.length(); i++) {
              if (name1.charAt(i) != ' ')
                  res += name1.charAt(i);
          }
          for (int i = 0; i < name2.length(); i++) {
              if (name2.charAt(i) != ' ')
                  res += name2.charAt(i);
          }
          int i = 0;
          int j = 0;
          while (i < name1.length() && j < name2.length()) {

              if (name1.charAt(i) == ' ') {
                  i++;
                  while (name2.charAt(j) != ' ') {
                      j++;
                  }
                  //移到空格后面
                  j++;
              } else if (name2.charAt(j) == ' ') {
                  j++;
                  while (name1.charAt(i) != ' ') {
                      i++;
                  }
                  i++;
              } else if (name1.charAt(i) == name2.charAt(j)) {
                  res -= 2 * name1.charAt(i);
                  i++;
                  j++;
              } else {
                  i++;
                  j++;
              }

          }
    
      return res;
  }

这个是最终版本,不知道能不能AC 有大佬的话麻烦看看。

static int calcSimilarity2(String name1, String name2) {
        
        int res = 0;
        if (name1.equals(" ")) {
            for (char c : name2.toCharArray()) {
                res += c;
            }
        }
        if (name2.equals(" ")) {
            for (char c : name1.toCharArray()) {
                res += c;
            }
        }else {
            //先把所有的ASCII码加起来 减去2倍重复的
            for (int i = 0; i < name1.length(); i++) {
                if (name1.charAt(i) != ' ')
                    res += name1.charAt(i);
            }
            for (int i = 0; i < name2.length(); i++) {
                if (name2.charAt(i) != ' ')
                    res += name2.charAt(i);
            }
            int i = 0;
            int j = 0;
            while (i < name1.length() && j < name2.length()) {

                if (name1.charAt(i) == ' ') {
                    i++;
                    while (name2.charAt(j) != ' ') {
                        j++;
                    }
                    //移到空格后面
                    j++;
                } else if (name2.charAt(j) == ' ') {
                    j++;
                    while (name1.charAt(i) != ' ') {
                        i++;
                    }
                    i++;
                } else if (name1.charAt(i) == name2.charAt(j)) {
                    res -= 2 * name1.charAt(i);
                    i++;
                    j++;
                } else {
                    i++;
                    j++;
                }

            }
        }
        return res;
    }
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值