Skip to content

KR2_Dolzhenko#9

Open
DolzhenkoAlexa wants to merge 1 commit intomainfrom
KR2_Dolzhenko
Open

KR2_Dolzhenko#9
DolzhenkoAlexa wants to merge 1 commit intomainfrom
KR2_Dolzhenko

Conversation

@DolzhenkoAlexa
Copy link
Owner

No description provided.


int main() {
bool arr[] = {1, 0, 1}; // 5 в десятичной (первоначальное число)
int lenA = 3; // длина массива а

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

На будущее, если задаёте тестовые данные в коде, старайтесь делать так, чтобы их было легко подменить:

Suggested change
int lenA = 3; // длина массива а
int lenA = sizeof(arr) / sizeof(bool);

#include <stdio.h>
#include <stdbool.h>

int numberGetter(const bool *a, int lenA) {

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Эта функция правильная, жаль всего остального нет.
Думаю, утешительные 3 балла можно поставить.

}

// Проверяет симметричность, если 0 - нет симметрии, если 1 - есть
int checkSimetric(Node* head) {

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Развернуть половину списка -- это очень круто. Правда, я видел тот же самый код у Михаила Васильева.
И у него это решение закоммичено на час раньше, чем у Вас.
При этом, прецедент со списыванием у Вас уже был.

Так что пока за эту задачу ничего ставить не буду, потом что-нибудь для Вас придумаем.

Copy link
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Простите, пожалуйста, за вопрос. А в чем необычность переворота половины списка? Метод двух указателей, пусть и в другом его проявлении проходился на ЕГЭ (Просто делали мы это с концов, left и right, хотя на несколько элементов мы кстати двигались, было такое, поэтому в указателях с шагом 1 и с шагом 2 ничего странного не вижу).
Да, на ЕГЭ был питон, а не С (но это не отменяет идеи, что с самим алгоритмом мы все знакомы в какой-то мере) и односвязный список и там можно было обратиться к элементам через индекс и легко найти середину. Тут же, так как список односвязан, надо найти середину самим, так как двигаться назад и получить прошлый элемент нельзя, то есть указатели left right нереализуемы. А тут середина ищется через A = 2B. И то, мой код не работает в некоторых случаях, значит я вообще совершила в своей идее ошибку.

Честно, вообще нет идей другого решения через односвязный список. Максимум можно было сохранить все элементы в массив и там уже анализировать палиндромность, но это запрещено условием. А больше идей, как без сохранения или переворота у меня честно нет. Кроме написания через двусвязный...
Но когда преподаватель на паре сказал "черт, не подумал, что через двусвязный список делать прям легко" мне было исправлять свой код уже поздно, да и я не умею резко менять планы, простите

Заранее спасибо за любой ответ
Была бы не против услышать ваши мысли на этот счет

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Необычность разворота половины списка заключается в том, что:

  • Другие так не сделали. Я видел этот метод только у Вас, Михаила и Алины.
  • Этот метод довольно сложен в реализации.
  • Это самый эффективный вариант на односвязном списке (он работает в два прохода и вообще не требует дополнительной памяти).

Немного проясню: идею развернуть половину списка я похвалил. Даже если Вы и не сами до этого додумались (нпаример, уже видели такую задачу при подготовке к ЕГЭ), всё равно очень хорошо, что Вы выбрали именно этот способ. И я в любом случае поставлю дополлнительные баллы за эту идею, так же как Михаилу.

Претензия не в том, что Вы использовали ту же идею, что у Михаила, а в том, что у вас совпадают реализации этой идеи. Вы можете открыть своё решение и решение Михаила, и сравнить их построчно.

А по поводу других вариантов, Вы можете посмотреть чужие решения. Я видел как минимум 3 других способа:

  • обращение к элементам по индексу (примерно то же, что Вы делаете в main при вставке элемента в конец списка);
  • копирование всего списка и разворот копии целиком;
  • два указателя на двусвязном списке.

И ещё интересное наблюдение: почему-то у Вас, Михаила и Алины совпадают некоторые моменты реализации, которые можно было сделать по-разному. Например, в main при вставке элемента в конец списка Вы каждый раз заново проходите по всему списку, хотя гораздо эффективнее было бы сделать как-то так:

Node* curr = head;
int num;
for (...) {
    scanf("%d", &num);
    curr->next = NewNode(num):
    curr = curr->next;
}

Copy link
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Хорошо, поняла вас, буду ждать вашего решения насчет нашей перепроверки
Спасибо за ответ

(если отправился запрос на ревью, то извините, случайно клацнула)

// Created by sasha on 05.12.2025.
//

#ifndef KR_PALINDROME_H

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

По стайлгайду нельзя использовать include guards.

Copy link

@p-senichenkov p-senichenkov left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Решили поставить половину баллов за эту задачу и провести переписывание в ближайшую пятницу. Плюс обещанные 5 баллов за использование оптимального алгоритма, -1 за остальные замечания. Итого 14/20.

while (firstPart != NULL && secondPart != NULL) {
if (firstPart->data != secondPart->data) {
return 0;
break;

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Зачем break после return?

@p-senichenkov
Copy link

А, ещё -1 балл за то, что линейный алгоритм становится квадратичным из-за неоптимального ввода в main. То есть, 13/20.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants