![]() |
Задачки для программистов
Да... заплесневели вы здесь ;)
Представляю ма-а-аленькие задачки для программистов на сообразительность. Если никто не решает - правильный ответ через 2 дня. 1) Даны две переменные, ну например a и b. Скажем а = 5, b = 3. Требуется: поменять местами их значения без объявления третьей (темповой) переменной. 2) Дан одностронний linked list. Требуется развернуть его. Естесственно красиво. 3) Дан вектор. Представте его как queue. Иначе говоря симулируйте очередь с помощью массива. Приятного голово-ломания :winkgrin: |
и на чем это дело надо реализовывать?кто на чем умеет?
|
Первая решается очень просто:
Код:
b := a + b; |
У меня тоже есть задачка на сообразительность: как вычислить максимальное значение целочисленных неотрицательных (типы byte, word) переменных a и b, не используя ветвления и циклов (на паскале)? Т.е. фактически найти max(a, b).
|
задача #1:
пусть b>a иначе аналогично a=(a+b)/2 b=b-a a=a+b b=a-2*b пока набирал уже ответили.... :( |
Код:
$a=5; |
cousin AVI
Дело не в языке, а в алгоритме. Можешь вообще на псевдокоде написать. Ghost linked list - связанный список. В типичной конфигурации, каждый елемент помимо даты имеет либо 2 указателя (двухсторонний список - prev и next) либо 1 указатель (одностронний список - next) Gike А на фига на 2 делить??? |
Цитата:
Возведи 2 в степень sizeof(byte) или sizeof(word) и т.д. |
Цитата:
и дальше через середину и длину a=(a+b)/2 - середина b=b-a - половина длины a=a+b b=a-2*b |
Programmer
А-а-а... Тады знаем-с. 2-ая задача (развернуть я так полагаю, преобразовать из 1->2->3 в 3->2->1) тоже решается просто. Писать прогу в ломы поэтому воспльзуюсь разрешением использовать псевдокод. ;) Короче так. Пусть heap - голова списка, ^.info - поле, ^.next - ссылка на следующий элемент. Тогда:
|
Programmer
Почитай внимательнее - надо написать прогу, которая выводит максимальное из двух чисел, но при этом не содержит ветвеления и циклов. ;) |
Max=(a+b+|a-b|)/2
Min=(a+b-|a-b|)/2 |
Gike
Молодца. :yees: Я первый раз тоже так решил. А теперь тоже самое без использования модуля?... ;) |
Ghost
Max=(a+b+sqrt((a-b)^2)/2 Min=(a+b-sqrt((a-b)^2)/2 :winkgrin: |
Gike
Хитрый. Надеюсь не надо объяснять, что при извлечении корня с последующим возведением в степень не избежать ошибок, т.е. придется еще и извлекать целую часть или округлять - гемор. Чтоб не мучались, вот до чего дошел я: Код:
c1 := ((1 - (b-a)) * (a xor b)) shr 15; |
Цитата:
а на понимание твоего решения у меня явно нехватает знаний:lamer: :) |
Ghost
Однозначно впереди. Ну а 3-ю задачу? |
Ghost
Только вот решение с модулем гораздо лучше, потому что во 2-ом твоём решении есть маленький недочет: оно работает только для 16-битовых типов. И не будет работать для всех остальных. Так что... |
А что третью? В моем понимании, вектор - одномерный массив (например, 1::2::3), а преобразовать его надо в списочек: 1->2->3. Это же стандартный алгоритм создания списка с головы (если просматривать массив с первого элемента) или с хвоста (если просматривать массив с конца), который рассказывается в первую очередь при изучении темы "Динамические структуры данных: связные списки". Я это и сам студентам рассказываю. Или я, может, задания не понял?...
По поводу решения без модуля: это действительно только для 16-битных чисел, просто я забыл это указать. Просто как-то раз возникла задача, написать такую прогу. Сперва написал с модулями, а мне говорят, мол, там все равно есть ветвление, хоть его и не видно - при вычислении модуля. Поэтому и придумал такой вот способ, хотя и к нему можно придраться - к сдвигу и xor'у... сказать, дескать, сдвиг на n бит - цикл, исключающее 'или' (т.е. xor) - ветвление. :( Кстати, если я не ошибся в своем предположении насчет третьей задачи абзацем выше, то вот код: Код:
uses |
Если хотите то одна из когда-то знаменитых Хайфских задач с курса "Структуры данных"--3й семестр--- ее потом любили на интервью спрашивать:
дан однонаправленный связный список. найти есть ли в нем петля и если есть то где ? (Будет решение может добавлю маленькое усложнение --- пока не буду подсказывать) |
a_ber
Ну дык, иди по списку, запоминай адреса, по которым прошел, и проверяй наличие очередного адреса в списке запомненных. Если найдешь повторяющийся, значит нашел начало петли. Признаю, алгоритм - дубовый, но сработает. ;) Может многие помнят по школе такую задачу: даны три натуральных числа - n, m и k. Необходимо найти k-ую цифру после запятой в десятичной дроби n/m. Я тут усложнил задачу и дал ее на недавно прошедшей в нашем ВУЗе олимпиаде - ни одна собака не решила. :) Короче, необходимо представить n/m в виде десятичной дроби с периодом (если есть). Например, 3/5=1.5, 1/30=0.0(3). Кто смогет? ;) |
Ghost
Ошибка. Надо превратить в queue. Шапку исправил. |
Ghost
Гы :) приколист. Твоё решение не эффективное. Если бы ты так ответил на интервью - хрен бы тебя взяли на работу. |
Ghost
Решение задачи: Код:
function MM(m1,m2:integer):string; В каком ты там вузе? |
a_ber
Pomoemy , esli vziat' dva ykazatelia i pustit' po spisky ... tol'ko odin (1) na sled. element a drygoy (2) cherez element, i proveriat' ih addresa ... esli odin iz ykazateley popal na Null znachit spisok ne zamknytiy , a esli addresa sovpali znachit est' petlia ... t.e. ykazatel' (2) "dogonit" ykazatel' (1) na listike vrode rabotaet ... |
Ghost
А рекурсией слабо лист развернуть ? gigi Код:
Node *ReverseList(Node *current, Node *parent) |
Programmer
Цитата:
f00rd Цитата:
Оригинальное решение, но можно проще: Код:
uses Цитата:
А слабо выполнить эту же задачу в Прологе? ;) |
2Programmer
Вполне можно обойтись одним параметром: Код:
Node *ReverseList(Node *current) |
BRULIK
Ghost Уважаемые сэры. Ваше решение по поводу петли неправильное. Дан лист: a->b->c->d->e и петля e->b начало: p1 = a, p2 = c шаги: 1. p1 = b, p2 = d 2. p1 = c, p2 = e 3. p1 = d, p2 = b 4. p1 = e, p2 = c 5. p1 = b, p2 = d Видно, что уже на 5-ом шаге мы приходим в ситуацию 2-го шага. И так далее. Да и посудите сами. С чего им догонять друг друга, если двигаются они с одинаковой скоростью. Расстояние между ними будет сохраняться. |
BRULIK
Ghost Весь прикол в том что они должны двигаться с разными скоростями. Чего вы в вашем решении не указали :) Код:
Node* p1 = tail, *p2 = tail; 1. p1 = b, p2 = c 2. p1 = c, p2 = e 3. p1 = d, p2 = c 4. p1 = e, p2 = e --> FINISH |
ia tak i napisal
Цитата:
|
brulik
Та как ты написал, не понятно, к чему относится "через один". К начальной позиции или к скорости. |
ребяты... :) первую на асме не проробовали??
push & pop ка раз меняет местами значения ... остальные - АСМ форева! нефиг пугать... если сообразительность заключается только в этом... по-моему ребята дали развернутые ответы... |
/7y3uK
Если честно, из твоего поста мало что понял. Что ты хотел сказать? 2 All Осталась 3-я задача (см. шапку). Если никто не решает, даю решение завтра. |
По поводу задачи о петле:
а) Начало правильное, но я еще не видел где координата за линейное время? б) Гост: линейной дополнительной памяти никто не давал ;) Мне (и не тол'ко мне) нравится этот паттерн: 2 пойнтера движушиеся с разной скоростью --- он иногда красиво применим в разных задачах, помню что были, но не помню деталей... в) Есть еще одно решение этой части задачи... кто найдет? |
Цитата:
берётся две интовые переменные (first_elem,first_empty). Одна указывает на первое занятое место в векторе, вторая на первое незанятое. Вначале обе указывают на 0. Также нужен флаг который говорит очередь пустая или полная, так как эти состояния рваны, с точки зрения указателей(first_elem == first_empty). Добавление элемента: Код:
if (queue_full == false) Код:
if (queue_full == true || first_empty != first_elem) first_elem = first_empty = 0; queue_full = false; |
joker99
Ну скажем не совсем так. Вторая функция у тебя не правильна. Во-первых когда ты Цитата:
Цитата:
Вот правильная имплементация dequeue(): Я держу переменные head (продвигается вправо когда элемент достаётся), tail (продвигается вправо когда елемент кладут в очередь) и count (для контроля над количеством элементов). Код:
Object dequeue() |
Цитата:
Цитата:
Цитата:
Ну неподумал я использовать простой счётчик, а так мой алгоритм работает. |
Цитата:
Цитата:
|
Цитата:
Тем более если елемент это не объект а value-type, то неизветно чем заполнят пустое место. |
Часовой пояс GMT +4, время: 15:42. |
Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.