携程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;
}