powered by simpleCommunicator - 2.0.28     © 2024 Programmizd 02
Map
Форумы / Java [игнор отключен] [закрыт для гостей] / LeetCode in Java
25 сообщений из 104, страница 3 из 5
LeetCode in Java
    #40120638
am_sasa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
оператор минус не использовать!
...
Рейтинг: 0 / 0
LeetCode in Java
    #40120644
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вопрос - к чему все это и зачем - так и остался без ответа..
вот это, например,

Valentin Kolesnikov
Задача сложения двух чисел не использую операторы + и -.

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
package g0301_0400.s0371_sum_of_two_integers;

// #Medium #Top_Interview_Questions #Math #Bit_Manipulation

...
    private int sum(int val1, int val2, int val3) {
        int count = 0;
        if (val1 == 1) {
            count = plusOne(count);
        }
        if (val2 == 1) {
            count = plusOne(count);
        }
        if (val3 == 1) {
            count = plusOne(count);
        }
        return count;
    }

    private int plusOne(int val) {
        return (-(~val));
    }
...


немедленно после первого написания могло бы выглядеть так:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
    private int sum(int val1, int val2, int val3) {
        int count = 0;

        count = plusOneChecked(val1, count);
        count = plusOneChecked(val2, count);
        count = plusOneChecked(val3, count);

        return count;
    }

    private int plusOneChecked(int icheck, int val) {
        return icheck == 0 ? val : -(~val) ;
    }



Или даже как-то так (это уже вопрос "философии")
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
    
       private int sum(int val1, int val2, int val3) {

         return plusOneChecked(val3, plusOneChecked(val2, plusOneChecked(val1, 0)));
    }

    private int plusOneChecked(int icheck, int val) {
        return icheck == 0 ? val : -(~val) ;
    }
...
Рейтинг: 0 / 0
LeetCode in Java
    #40120681
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мы на системотехнике оптимизировали сумматор. Там кажется вводится параллелизм для групп 4х
битов (квартет) и суммирование идёт группами. 4х4 = 16. Булева функция. 8 входов и 5 выходов.
4 бита результат и бит переноса в следующую группу.

Разумеется сабж - не решение Литкодов а просто ускорение последовательной операции суммы с переносом.
...
Рейтинг: 0 / 0
LeetCode in Java
    #40120706
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Оптимизация, там где речь про скорость - сам по себе мутный, привязанный к исторически случайной частности вопрос,
и улучшения того, что называют "качеством кода" не предполагает.

"Улучшение" кода - это обычно что-то другое - либо повышение читаемости, либо появление такого качества, которое не обязательно связано со скоростью, а, как вариант, с увеличением степени полезного повторного использования кода,
например - расширением области или удобства применимости конкретного фрагмента кода на другие типы данных,
по отношению к которым требуется алгоритм того же сорта.

способ потенциально ускорить - это, например, дописать private static int plusOneChecked
Но насчет того - несомненно ли это улучшение - до вечера пятницы вряд ли удастся договориться.

Как-то так.
...
Рейтинг: 0 / 0
LeetCode in Java
    #40120714
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В аннотации проекта написано

Java Solution for LeetCode algorithm problems, continually updating.

Тоесть - решение как таковое. Отлично. Тогда то что ты предлагаешь - это рефакторинг.
Рефакторинг - полезный. Я за него голосую +1 и надеюсь Валентин его затащит в свой
код.

Вообще конечно жаль что проект поднят именно под Java. Красивых Single-Line solutions
тут не сделаешь. Вот если-бы была Scala - то даааа.

Короче дальше идём под флагом улучшений кода в части хотя-бы уменьшения букв.
Конечно до языка APL доходить не будем, но такой рекурсивный реплейсмент - я думаю
пойдет.

Главное чтоб студент на собеседовании смог пояснить что это означает. Я разумеется
предполагаю что он зашел в гитхаб и стянул решение себе.
...
Рейтинг: 0 / 0
LeetCode in Java
    #40120726
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton

...
Тогда то что ты предлагаешь - это рефакторинг.
...

Не-не.
Рефакторинг не может начаться раньше того, как ты дошел, или тебя довели
до состояния полного разрушения личности перед лицом невыполнимости задачи.

Тогда, чтобы не убить кого-нибудь, или не убиться самому, ты придумываешь "рефакторинг"
для укрепления нервной системы, в надежде, что вдруг, после переставления шашек жизнь сама наладится.
Рефакторинг, это когда понятия "верх" и "низ" у программы давно перепутались, и уже никто не знает, где они были.

PS
Я ничего не предлагаю вообще.
Я лишь следую завету, гласящему, что первым пером написанная программа еще не написана.
Ее необходимо переписать после этого не менее двух раз (по Бруксу двух, а чуть более молодые товарищи говорят - "мы не знаем, сколько раз потребуется")
Это не рефакторинг.
Это нормальный , без кардилогической скорой помощи, такой процесс встречного движения "сверху вниз" и "снизу вверх",
в результате которого самому создателю более менее становится ясно - где же у программы верх, а где низ.

Рефакторинг же возникает только после того, как программа признается негодной к работе во вновь обнаруженных обстоятельствах.

При нормальном движение - программа в каждой своей инкарнации - годная , но по тем или иным причинам - следующая версия годнее предыдущей.
...
Рейтинг: 0 / 0
LeetCode in Java
    #40120732
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хорошо. Но я не согласен с термином оптимизация . В моём понимании
оптимизация - измеряема. Тоесть мы можем посчитать speedup приложения
после процесса о.
...
Рейтинг: 0 / 0
LeetCode in Java
    #40120734
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
booby,
Не. Я думаю что рефакторинг это как восстановление днк во время сна человека.
Это планомерный процесс улучшения продукта.
Это как выделение 10 проц времени на саморазвиие. Или 5 проц денег на рекламу продукта.
...
Рейтинг: 0 / 0
LeetCode in Java
    #40120736
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Книгописатели (толи Фаулер толи Боб я их путаю) говорят что рефакторинг нельзя начинать
пока нет модульных тестов.

Поскольку там есть какое-то базовое покрытие https://github.com/javadev/LeetCode-in-Java/blob/main/src/test/java/g0301_0400/s0371_sum_of_two_integers/SolutionTest.java
и вообще я знаю что Валентин - человек скурпулёзный и заведомо думает о тестах то я думаю что рефакторить
можно. И то улучшение которое предлагает booby - это есть рефакторинг
нацеленный на уменьшение количества строк кода с сохранением читаемости.
Если какие-то ветви алгоритма не закрыты зеленым маркером coverage - то
можно просто добавить больше кейсов.

По поводу читаемости - можно голосовать. Я другого способа не знаю.
...
Рейтинг: 0 / 0
LeetCode in Java
    #40120737
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PetroNotC Sharp,

у меня рефлекс устойчивый выработался - когда я включаю кино на ютубе, и человек сразу после представления заявляет
- "Я люблю заниматься оптимизацией" - то для меня обычно этого достаточно, чтобы дальше не смотреть.
...
Рейтинг: 0 / 0
LeetCode in Java
    #40120738
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
...
нацеленный на уменьшение количества строк кода с сохранением читаемости.
...

Нет .
Конкретно в данном случае это самый что ни на есть "школьный" пример выделения повторно применяемого кода в самостоятельную функцию.
Ввиду его очевидной повторности, а значит, полезности такого выделения.
Все прочее - случайный (почти) результат этого процесса.
...
Рейтинг: 0 / 0
LeetCode in Java
    #40120739
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
booby, поздно друг. Ты представлен к медали. Тебя ждут памятные подарки и почетная грамота.

P.S. Чудак-человек. Сделал полезное дело и ... отнекивается. Я дескыть "глаз пристелямши..." Ну йомайо...
...
Рейтинг: 0 / 0
LeetCode in Java
    #40120747
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
оно, спасибо, конечно...
к "пристрелянному глазу" имею тенденцию скорее с пиететом чаще, чем со смехом относится.

Мой глаз в этом плане всегда был недостаточно тренирован.

И особенно с учетом знания физиологии зрения - картинка всегда создается урывочными концентрациями
внимания на отдельных точечных фрагментах.
Чтобы понять, что же за картина - надо несколько раз посмотреть и обнаружить при следующих просмотрах то, что не видел в предыдущих.
Нетренированный глаз вообще не знает, с какого конца рассматривать, и, чем больше тренирован, тем выше вероятность, что наработанная траектория движения при просмотре, и выбор точек останова дадут больше информации для принятия решения.
Но не смотреть повторно - значит, скорее всего, так и оставить картину без ясного понимания, что же увидел или написал.
...
Рейтинг: 0 / 0
LeetCode in Java
    #40120755
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
booby
PetroNotC Sharp,

у меня рефлекс устойчивый выработался - когда я включаю кино на ютубе, и человек сразу после представления заявляет
- "Я люблю заниматься оптимизацией" - то для меня обычно этого достаточно, чтобы дальше не смотреть.
)))
Ну пусть любит. Только ограничивать себя надо.
Я вот тоже водку люблю).
Но если он маньяк оптимизатор то согласен))
...
Рейтинг: 0 / 0
LeetCode in Java
    #40120866
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
попробуем провести еще одну не оптимизацию и не рефакторинг с целью избавления от умения вычислять обратное по сложению число.
В сумматоре, в исходной версии которого первый и второй параметры - значения складываемых разрядов, а третий - входящий знак
переноса, история разбивается на два случая по отношению к полученному знаку переноса.

1) пусть он ноль, сохраняя порядок входных параметров из исходной версии sum, видим следующее
abcarry_in carry_out r00000010011000111010
выходные значения вычисляются так:
carry_out = a & b;
r = a ^ b;
или, с использованием ранее вычисленного carry_out:
r = (~carry_out) & (a | b);

2) при carry_in = 1 :
abcarry_in carry_out r00101011101011011111
то есть
carry_out = a | b;
r = (a & b) | (~(a | b));
или, с использованием ранее вычисленного carry_out:
r = (~carry_out) | (a & b);

В обоих случаях возврат, эквивалентный исходному, формируется как
return ((carry_out<<1) | r);

с сохранением порядка смысловых параметров и результата получаем примерно такое:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
private static int  sum( int a, int b, int carry_in ) {
      int x;
     
     switch (carry_in) {        
          case 0:
              x = ((a & b) << 1) | (a ^ b);
              break;
         default:
              x = ((a | b) << 1) | (( ~(a | b)) | (a & b));
     }
     return x;
}



избавляться от plusOne для вычисления exp и count ( exp = plusOne(exp); count = plusOne(count);) можно по разному:

для count вместо сложения можно перейти к сдвигу на 1 разряд влево, а от exp, может быть, я предпочел бы вообще отказаться
и перешел бы к заполнению битов предварительного результата в обратном порядке,
сдвигая его на 1 влево и всегда заполняя младший разряд.
Тогда последней операцией при слежении за младшим разрядом должен стать вызов одного из подходящих под "не использовать плюс и минус" вариантов функции обращения битов.

Вероятно, я бы сменил тактику со слежения за младшим битом на слежение за старшим,
путем путем высекания (a <<1) & 2147483147, cдвигая налево текущее значение пока сдвигаемый
также налево на единицу count не превысит 2147483147,
тогда реверсный вариант формирования результата автоматически давал бы правильный выходной результат.

Выписывать полный код мне неохота.
Прошу прощения.
...
Рейтинг: 0 / 0
LeetCode in Java
    #40120876
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Последнюю часть мутно написал.
В общем, перед слежением за старшим разрядом, надо предварительно развернуть циклическим
сдвигом на 32 разряда оба слагаемых. Тогда пазл соберется правильно от старших разрядов.
Или оставить все как есть при слежении за младшим, и тем же сдвигом вращать только результат.
exp исчезнет в обоих случаях.
...
Рейтинг: 0 / 0
LeetCode in Java
    #40120877
Фотография Valentin Kolesnikov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Так было-бы интереснее. Длинная арифметика.

Код: java
1.
public int[] getSum(int[] a, int[] b) 



Есть такой проект.
...
Рейтинг: 0 / 0
LeetCode in Java
    #40120981
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Valentin Kolesnikov
mayton
Так было-бы интереснее. Длинная арифметика.

Код: java
1.
public int[] getSum(int[] a, int[] b) 



Есть такой проект.

По сумме двух целых чисел.

Насколько я понимаю этот стикер,

Код: java
1.
// #Medium #Top_Interview_Questions #Math #Bit_Manipulation



задача может быть задана на собеседовании? Или выдана в качестве тестового задания.
...
Рейтинг: 0 / 0
LeetCode in Java
    #40120987
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А вот как работают сумматоры в системотехнике http://texnic.ru/tools/cif_ms/8.html

В топике что-бы мы не придумывали - мы создаем имплементацию последовательного сумматора.
Кстати мой вариант с параллельным суммированием квартетов битов тут не показан.
Зато показан абсолютно параллельный сумматор (комплексность последнего правого
элемента просто поражает воображение).
...
Рейтинг: 0 / 0
LeetCode in Java
    #40120993
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,

сумматоры на java моделировать, не сильно благодарная задача с первого взгляда, имхо.

городить объекты там, где в других языках достаточно выходных параметров - сердце кровью обливается.
В ее варианте "безопасной объектно-ориентированности" нужно долго думать, чтобы что-то не смешное на объектах нагородить.
...
Рейтинг: 0 / 0
LeetCode in Java
    #40120999
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
"Программировать на интерпретаторах - себя не уважать".
Или умерьте осетра категоричности или выжгите калёным железом всё, начиная с /bin/sh и SIM-карт.
...
Рейтинг: 0 / 0
LeetCode in Java
    #40121003
Фотография Valentin Kolesnikov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Valentin Kolesnikov
пропущено...


Есть такой проект.

По сумме двух целых чисел.

Насколько я понимаю этот стикер,

Код: java
1.
// #Medium #Top_Interview_Questions #Math #Bit_Manipulation



задача может быть задана на собеседовании? Или выдана в качестве тестового задания.


Это список тэгов. Обычно спрашивают не само решение а то как ты его объясняешь.
...
Рейтинг: 0 / 0
LeetCode in Java
    #40121005
Фотография Valentin Kolesnikov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Такую задачу могут спросить. Нужно понимать как хранятся данные.

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
package g0201_0300.s0208_implement_trie_prefix_tree;

// #Medium #Top_100_Liked_Questions #Top_Interview_Questions #String #Hash_Table #Design #Trie

@SuppressWarnings("java:S1104")
public class Trie {
    private TrieNode root;
    private boolean startWith;

    public Trie() {
        root = new TrieNode();
    }

    // Inserts a word into the trie.
    public void insert(String word) {
        insert(word, root, 0);
    }

    private void insert(String word, TrieNode root, int idx) {
        if (idx == word.length()) {
            root.isWord = true;
            return;
        }
        int index = word.charAt(idx) - 'a';
        if (root.children[index] == null) {
            root.children[index] = new TrieNode();
        }
        insert(word, root.children[index], idx + 1);
    }

    // Returns if the word is in the trie.
    public boolean search(String word) {
        return search(word, root, 0);
    }

    public boolean search(String word, TrieNode root, int idx) {
        if (idx == word.length()) {
            startWith = true;
            return root.isWord;
        }
        int index = word.charAt(idx) - 'a';
        if (root.children[index] == null) {
            startWith = false;
            return false;
        }

        return search(word, root.children[index], idx + 1);
    }

    // Returns if there is any word in the trie
    // that starts with the given prefix.
    public boolean startsWith(String prefix) {
        search(prefix);
        return startWith;
    }
}


class TrieNode {
    // Initialize your data structure here.
    public TrieNode[] children;
    public boolean isWord;

    public TrieNode() {
        children = new TrieNode[26];
    }
}
...
Рейтинг: 0 / 0
LeetCode in Java
    #40121006
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я обычно так делал.

Код: java
1.
public List<TrieNode> children;



И пустую коллекцию создавал. Иначе во всех листовых узлах будет 26 пустых элементов.
...
Рейтинг: 0 / 0
LeetCode in Java
    #40121046
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. Sidorov
...
... умерьте осетра ...

осетры разные нужны, и многие из них даже важны.
Но идеально каждый осетр плавает в своем специфическом контексте.
Осетр в бассейне неправильного размера может выглядеь вполне нелепо.
...
Рейтинг: 0 / 0
25 сообщений из 104, страница 3 из 5
Форумы / Java [игнор отключен] [закрыт для гостей] / LeetCode in Java
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]