Можно ли упростить этот код до 5 строк (вопрос из собеседования на позицию senior javascript developer)?:
function func(s, a, b)
{
var match_empty=/^$/ ;
if (s.match(match_empty))
{
return -1;
}
else
{
var i=s.length-1;
var aIndex=-1;
var bIndex=-1;
while ((aIndex==-1) && (bIndex==-1) && (i>=0))
{
if (s.substring(i, i+1) == a)
aIndex=i;
if (s.substring(i, i+1) == b)
bIndex=i;
i--;
}
if (aIndex != -1)
{
if (bIndex == -1)
return aIndex;
else
return Math.max(aIndex, bIndex);
}
else
{
if (bIndex != -1)
return bIndex;
else
return -1;
}
}
};
Ответ
Навскидку, вроде бы, вот так можно «упростить»:
function func(s, a, b)
{
return Math.max( s.lastIndexOf(a), s.lastIndexOf(b));
}
Но это не правильно обработает случаи с пустыми строками в a или b. Поэтому:
upd. с тестами
function funcSergiks(s, a, b) {
return Math.max(
(a.length ? s.lastIndexOf(a) : -1), (b.length ? s.lastIndexOf(b) : -1)
)
}
// ---------------------------------------
function func(s, a, b) {
var match_empty = /^$/;
if (s.match(match_empty)) {
return -1;
} else {
var i = s.length - 1;
var aIndex = -1;
var bIndex = -1;
while ((aIndex == -1) && (bIndex == -1) && (i >= 0)) {
if (s.substring(i, i + 1) == a) aIndex = i;
if (s.substring(i, i + 1) == b) bIndex = i;
i--;
}
if (aIndex != -1) {
if (bIndex == -1) return aIndex;
else return Math.max(aIndex, bIndex);
} else {
if (bIndex != -1) return bIndex;
else return -1;
}
}
};
var tests = [
[
['google', 'g', 'o'], 3
],
[
['aba', 'a', 'b'], 2
],
[
['', 'g', 'o'], -1
],
[
['google', 'x', 'o'], 2
],
[
['aba', '', ''], -1
],
[
['aba', 'a', ''], 2
],
[
['aba', '', 'b'], 1
],
[
['aba', 'a', 'b'], 2
],
];
tests.forEach(test => {
var a = func.apply(this, test[0]);
var b = funcSergiks.apply(this, test[0]);
console.log(a == b && b == test[1] ? "PASSED" : "FAILED", JSON.stringify(test), a, b);
});
Комментариев нет:
Отправить комментарий