Проблем с Alone Numbers, JS

Здравейте,

Не мога да се справя с една от задачите от примерния изпит. Получавам резултат от 66.667 точки, но изглежда, че последните три test case-а не отговарят на условието на задачата (т.е. от подадените няма “alone numbers” и/или не са равни на target-а).
Може би аз пропускам нещо, но не знам как да процедирам.

Условието е следното.

Опитах да изкарам изходните данни, които се подават и получих следното.

:point_up: ''checker" съм именувал target-а.
:point_up: ''digits" съм именувал подадения array.

Кодът е тук.

Ще съм благодарен, ако някой ми разясни къде бъркам. :relieved:

Тъй,като решавам с Python в момента,но мога да видя и други решения на JS примерно ето ти едно да си разцъкаш логиката.

const arr = gets().split(', ');
let target = gets();

for (let i = 1; i < arr.length - 1; i++) {
    if ((arr[i] === target) && (arr[i] !== arr[i + 1]) && (arr[i] !== arr[i - 1])) {
        if (arr[i - 1] > arr[i + 1]) {
        arr[i] = arr[i - 1];
        } else {
        arr[i] = arr[i + 1];
        };
    };
};
print(`[${arr}]`);

Кратко и ясно по същество в първия ти if имаш много “или” вместо “и”-та.А самото условие изисква точно определени елементи от масива да отговарят на няколко критерия на веднъж а не от време на време,както става с “или” логическият оператор.

Иначе си на правилен път.
Успех

3 Likes

Друго нещо е цикъла ти да върти от 1 до array.length - 1 така изключваш първи и последен елемент ,които никога не са alone numbers,нещо което мен ме затрудни да измисля в началото.

Благодаря ти!

Наистина “или”-тата вместо “и”-тата ми бяха грешката. Това е вероятно и последното нещо, на което щях да обърна внимание. :smile:

1 Like

Не мисля , че е добре да ползваш var ,защото нямам собствен scope , a e към глобалния .ето още едно решение let arr = gets().split(", ").map(Number)
let number = +gets()
//let aloneNumber = false

for (let i = 1; i < arr.length - 1; i++) {
const element = +arr[i];
const previous = +arr[i - 1]
const next = +arr[i + 1]
if (element === number && element !== previous && element !== next) {
arr[i] = Math.max(previous, next);

}

}

print([${arr.join(", ")}])

Благодаря!
Не знаех разликата между let, var и const. Но прочетох и вече ще го имам предвид. :slight_smile:

1 Like

Избягвайте всякаква употреба на “var”. Ще дойде време в курса, когато ще бъде обяснено защо. Но за момента забравете за него. За “const” - инициализиране и деклариране на променливи, на които няма да променяте стойността. Тук обаче трябва да се има предвид типа на променливите. Ако са от референтен тип (като масивите например) може да се използва “const” и това няма да ви попречите да променяте елементи вътре в масива или да добавяте, или да махате такива от него. Винаги, когато може да ползвате const - използвайте го. За “let” - променливи, на които ще променяте стойността (най-често за броячи например).

2 Likes

Здравейте, тази задача ме озадачава значително. Да започнем с условието първо пише, че се дава масив, а на практика се дава стринг, от който можем да си направим масив. Хубаво, можем да го интерираме по различни начини. Трябва да върнем нова версия на дадения масив което на практика е невъзможно. Но дори и да върнем верен масив системата дава грешен отговор и Short circuits. Единствения начин да приеме отговора за верен и да върнем стринг който прилича на масив. Къде ми се чупи логиката? Или просто не познавам функционалността на системата?

Стринга се превръща в масив ,при който по индекс може да сменяме стойностите му.