Mock Exam 3: Alone Numbers

Здравейте,
Бихте ли мe насочили към решението, понеже имам лекo затруднениe да открия къде е грешката ми.

Условие на задачата:

Кодът ми:

Резултатът, който получавам:

Здравей,
Преработих твоето решение и сега минава със 100/100

Ето и моето решение, което пак е с Лист, но е малко по-различно

Поздрави,

Много ти благодаря :blush:

1 Like

Здравейте искам да попитам две неща.

Първото е дали някой може да ми каже къде ми греши задачата :Д import java.util.Scanner;public class AloneNumbers { public static void - Pastebin.com

И второто е дали се очаква проактивно да е запознаваме с по advanced структури като хаш мапове, arrayslist etc. Питам защото в материалите за самоподготовка поне аз не намерих информация за тях а виждам че доста от хората ги ипозлват за решаването на задачите.

Здравей,
Някакъв едж кейс бяга, в момента поизтупвам праха от джавата си и ще пиша като го намеря.
Хаш мапове и арей листи не ти трябват за конкретната задача.
Към момента мога да ти кажа, че начина по който принтираш резултата е прекалено сложен:

System.out.println(Arrays.toString(numbers));

е напълно достатъчно.

Edit:
Измислих го:

import java.util.Arrays;
import java.util.Scanner;

public class AloneNumbers {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String input = scanner.nextLine();
        String[] masiv = input.split(", ");
        int[] numbers = new int[masiv.length];

        //Getting the array
        for (int i = 0; i < masiv.length; i++) {
            numbers[i] = Integer.parseInt(masiv[i]);
        }

        //Target input
        int target = scanner.nextInt();
        int index = 0;
        for (int number:numbers) {
            if (number == target){
 //тук проверяваме дали числото, което четем е равно на таргета
                if (index > 0 && index < numbers.length - 1 && number != numbers[index - 1] && number != numbers[index + 1]){
 //тук проверяваме дали сме на индекс, който не е първия или последния и дали числото е само
                    numbers[index] = Math.max(numbers[index - 1], numbers[index + 1]);}}
 //ако горните условия са изпълнени, тук заменяме числото на което сме в момента с по-голямото от лявото или дясното
            index++;
        }
        System.out.println(Arrays.toString(numbers)); //тук принтираме модифицирания масив
    }
}

Ето го и твоето решение с поправената грешка:

import java.util.Arrays;
import java.util.Scanner;

public class AloneNumbers {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String input = scanner.nextLine();
        String[] masiv = input.split(", ");
        int[] numbers = new int[masiv.length];

        //Getting the array
        for (int i = 0; i < masiv.length; i++) {
            numbers[i] = Integer.parseInt(masiv[i]);
        }

        //Target input
        int target = scanner.nextInt();
      
       if (numbers.length == 1) {
            System.out.print("[" + numbers[0] + "]");
        } else if (numbers.length == 2) {
            System.out.print("[" + numbers[0] + ", " + numbers[1] + "]");

        } else {
            for (int i = 1; i < numbers.length - 1; i++) {
//if (**!(numbers[i] == numbers[i - 1] && numbers[i] == numbers[i + 1])** && numbers[i] == target) {
//Тук проверката ти е почти правилна, отдолу е правилната
//Проверяваш дали обратното на това във скобите връща True. Тоест, ако numbers[i]  е равно на лявото И на дясното число (едновреммено, тоест имаш серия от примерно 3, 3, 3, двете проверки вътре ти връщат True/True, което после обръщаш на False и кода в ифа не се изпълнява.
//Ако имаш 1,2,3 вътре ти връща False/False, Което се обръща на True и кода се изпълнява
//Ако обаче имаш 2, 2, 3, връща True/False, което по начина на проверката ти става False, обръща се в True и кода се изпълнява, което обаче не трябва да се случи
//Последният ти вариант е 1, 2, 3, това връща False/False, което се обръща в True и кода се изпълнява. Проблемът идва от момента, в който само едно от числата от ляво или дясно съвпада с целевото.
                if (numbers[i] != numbers[i - 1] && numbers[i] != numbers[i + 1] && numbers[i] == target) {
                    if (numbers[i - 1] > numbers[i + 1]) {
                        numbers[i] = numbers[i - 1];
                    } else {
                        numbers[i] = numbers[i + 1];
                    }
                }
            }
            for (int i = 0; i < numbers.length; i++) {
                if (i == 0) {
                    System.out.print("[" + numbers[i] + ", ");
                } else if (i == (numbers.length - 1)) {
                    System.out.print(numbers[i] + "]");
                } else {
                    System.out.print(numbers[i] + ", ");
                }
            }
        }
    }
}
 

Описал съм ти проблема като коментари, ако искаш може да си го копираш директно в IDE за да е по-лесен за четене кода. :slight_smile:

Ето и т.нар. Logic gates, с които не е лошо да е запознат човек, когато пише if statements:

Здравейте, тъй като моето решение на задачата на JavaScript работи при мен във VSCode, не разбирам защо не работи когато го предам като решение в сайта.

const input = [[1, 2, 3, 2, 5, 2], '2']

let print = this.print || console.log
let gets =
    this.gets ||
    (
        (arr, index) => () =>
            arr[index++]
    )(input, 0)

const numbers = gets()
const target = +gets()

for (let i = 1; i < numbers.length; i++) {
    if (
        numbers[i] === target &&
        numbers[i - 1] !== target &&
        numbers[i + 1] !== target
    ) {
        let biggerNumber = 0
        if (numbers[i - 1] >= numbers[i + 1]) {
            biggerNumber = numbers[i - 1]
        } else if (numbers[i + 1]) {
            biggerNumber = numbers[i + 1]
            numbers[i] = biggerNumber
        }
    }
}

print(numbers)

Принтираш входния масив, доколкото виждам, на първия тест в системата очаквания изход е 1, 3, 3 а твоя е 1, 2, 3.

Проверката на 23ти ред е ненужна, може да е директно else, без if(numbers[i+1]). Не съм сигурен точно какво би върнало това в JS. :slight_smile:

По някаква причина не влиза в иф-а на 15ти ред.
Също, на 25ти ред подменяш, но само ако следващото число е по-голямо, ако предишното е по-голямото не правиш нищо.