Така, така, идеята е да се стигне до решение със знанията, които имаме до момента. Имайки предвид сериозната каша в главата ми, съм решил само част от задачите, но съвсем самостоятелно. Помощ не търся, а мога да да получа ако искам. Трябва сам да достигна до решението на конкретен проблем. Това е принципна позиция. Позиция, базирана на дългогодишен опит в друга сфера на живота.
@medon3, решението със стрингове работи само за едноцифрени числа разделени с интервали. Ако имаме някъде число с повече от една цифра или отрицателно число, то решението няма да работи. Това е така, тъй като в логиката си винаги parse-ваш единствено едно символче от текста. От друга страна, за тези дето са използвали масиви: логиките на функции като split се базират на обхождането на String като последователност от Character-и, тоест има само цикли.
(Но тези split функции може да са много по-сложни, ако например използват регулярен израз, по който да split-ват, е необходимо да построят структура от данни като автомат за разпознаване или някаква друга помощна структура, която изобщо не е тривиална (не знам точно как е имплементирано в Java), но идеята е, че ако се опитате да избегнете някакъв подход като използвате някаква функция, то това не е точно избягване, тъй като подхода е имплементиран в самата функция, просто ние не го виждаме и я ползваме на готово).
Но в крайна сметка, независимо дали сме взимали нещо или не, работещо решение винаги е в пъти по-добре от липсващо.
@andy Да, точно така е, това със Стринга също не е оптимално решение, сигурна съм че може да се реши по още много начини, мисля да опитам малко по-късно, но първо ще реша задачата със Спиралата. Също, според мен е много ценно че тук обменяме опит и се намират много различни начини за решение на една задача
Със сигурност не е правилно. Аз съм я направил без масиви.
Как, обаче, би направил 14та (SpiralMatrix), без да ползваш масив ???
Има начин, да работи, стига числата да са отделени коректно, едно от друго (с интервал, запетая, или някакъв, друг знак, който не е цифра, без, да се използват масиви, или split.
Всъщност, подобно е на split, но не изисква ползването на масив.
Всяка задача, може, да се реши по много и различни начини. Всичко зависи от начина, по който мисли решаващият. Успех!
За абсолютно начинаещ като мен никак не е леко да вникна в немалко от нещата. До решение може би ще достигна, може би не.
Точно така!
Няма страшно!
В задачата за спиралата няма нищо специално. Предполагам са я сложили само като teaser, тоест да подразнят, че не може да се сетим как да стане без масиви. Но реално задачата не е нищо повече от една много груба аритметика. Такъв тип задачи се решават с чертане на хартия доста време преди да успееш да намериш някакъв pattern (шаблон, по който да изчисляваш числото според позицията му). Подобен тип задачи, както и други за рисуване по конзолата нямат никакво приложение в реалния свят. Няма да казвам, че са чиста загуба на време, тъй като имат своята стойност (като например рисуването на триъгълника на Паскал може и да помага в подходи при решаване на комбинаторни задачи), но определено не са неща, за които трябва да се ядосваме, ако не сме се сетили.
import java.util.Scanner;
public class Problem14SpiralMatrix {
public static void main(String... args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int belowMain, aboveMain, x;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
belowMain = Math.min(i, j);
aboveMain = Math.min(n - i - 1, n - j - 1);
x = Math.min(belowMain, aboveMain);
if (i <= j) {
System.out.printf("%d ", n * n + 1 - ((n - 2 * x) * (n - 2 * x) - (i - x) - (j - x)));
} else {
System.out.printf("%d ", n * n + 1 - ((n - 2 * x - 2) * (n - 2 * x - 2) + (i - x) + (j - x)));
}
}
System.out.println();
}
}
}
Благодаря на всички, които споделиха решения или мнения, всичко е полезно и от всеки може да се научи много, сигурна съм в това
@andy Много благодаря за решението, ще го видя после, първо ще се опитам да я реша сама
А би ли споделил тук на кое всъщност трябва да обърнем най-голямо внимание като заучаване и овладяване? Защото все пак за първи път повечето от нас се сблъскваме с програмирането, а ти определено не звучиш като един от нас:) Поздрави и Благодаря за инфото…
Малко ми е трудно да отговоря, но честно казано най-адекватния отговор май е „НА ВСИЧКО“. Това са базови/основни неща, трябва да се обърне внимание на абсолютно всичко, да се опитвате да счупите нещо, да експериментирате и да си задавате въпроса „това защо се държи така?“, да дебъгвате и да си давате отговор на този въпрос. Да сте любопитни и да сте алчни за повече, да не се задоволявате само с това което ви дава курса. Да решавате много задачи и да се тормозите :D. За съжаление това е рецептата.
NB: това, че в задачата за спиралата има два цикъла и един if не означава, че е тривиална. Определено е доста синтетична/изкуствена и неинтуитивна и е хубаво само да се опитате да я решите и ако не се получи да я оставите и може би след време пак да се върнете на нея. Но искам да кажа, че тя не е мерило за качества.