Здравейте,
Бихте ли мe насочили към решението, понеже имам лекo затруднениe да открия къде е грешката ми.
Условие на задачата:
Кодът ми:
Резултатът, който получавам:
Здравейте,
Бихте ли мe насочили към решението, понеже имам лекo затруднениe да открия къде е грешката ми.
Условие на задачата:
Кодът ми:
Резултатът, който получавам:
Здравей,
Преработих твоето решение и сега минава със 100/100
Ето и моето решение, което пак е с Лист, но е малко по-различно
Поздрави,
Много ти благодаря
Здравейте искам да попитам две неща.
Първото е дали някой може да ми каже къде ми греши задачата :Д 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 за да е по-лесен за четене кода.
Ето и т.нар. 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.
По някаква причина не влиза в иф-а на 15ти ред.
Също, на 25ти ред подменяш, но само ако следващото число е по-голямо, ако предишното е по-голямото не правиш нищо.