Статьи
Вопросы на собеседовании для PHP-программиста (часть 1)
С некоторых пор я решил записывать все задаваемые мне вопросы на собеседованиях.
В этой статье хотел бы поделиться ими с аудиторией job-interview. За весь мой опыт прохождения собеседований вопросов набралось немало. Во всяком случае на одну статью не хватит, поэтому здесь я выложу часть из них. Остальные вопросы буду выкладывать в последующих статьях.
Я являюсь PHP-программистом, поэтому все вопросы будут из этой области.
На собеседовании работодатели обычно разделяют их по следующим темам:
- PHP
- Задачи по составлению различных запросов SQL
- Администрирование СУБД (обычно это MySQL)
- Основные принципы ООП
- Регулярные выражения
- Основные протоколы интернета
- Работа в командной строке Linux
Итак, начнем.
PHP
1. Имеется массив целых чисел, все числа кроме одного встречаются в массиве дважды. Необходимо реализовать функцию поиска числа, встречающегося в массиве один раз.
2.
1 2 3 4 5 <?php $i = 10; $i += ++$i + $i + $i++; print $i; ?>Сколько выведет? Почему?
3.
1 2 3 4 5 6 7 8 9 10 11 12 13 <?php class ListItem { var $next; } $a = new ListItem(); $b = new ListItem(); $c = new ListItem(); $a->next = $b; $b->next = $c; $c->next = null; ?>Необходимо написать функцию, которая на вход получает объект $а, а возвращает перевернутый список.
4. Как реализовать множественное наследование в PHP?
5. Чем отличается наследование в javascript от наследования в PHP?
Запросы SQL
- Есть таблица currency_course, в которой перечислены курсы валют за конкретную дату.
Поля таблицы currency_course:
currency (тип валюты — USD, EUR и т.д.),
date (дата установленного курса),
course (курс валюты)
Требуется выбрать последние курсы по каждой валюте.- В таблице 1 000 000 записей. Необходимо предложить варианты выбора 10 случайных записей. Запрос вида select * from table order by rand() limit 10 не подойдет, т.к. очень «тяжелый».
- В таблице 1 000 000 записей. Есть поле, которое принимает только одно из двух значений. Стоит ли индексировать по этому полю?
- Необходимо предложить структуру базы данных для хранения древовидных комментариев.
- Имеется таблица покупателей с полями: id, name
А также таблица продаж: id, cust_id, date, summ_pay
Необходимо:
а) Вывести лучшего покупателя.
б) Вывести лучших покупателей за каждый месяц.
Пока все. Продолжение следует...
|
|
0 | Tweet | Нравится |
|
На эту статью оставлено 36 комментариев
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
Pablo Monteagudo
01 Февраль 2010 11:56:29 (ссылка)Еще задача по написанию запроса.
Имеется таблица в базе данных, значения одного из полей которой натуральные числа.
В значениях поля имеются пропуски (например 1, 2, 5, 6, 8).
Напишите SQL-запрос, который вычисляет с каких значений этого поля начинаются пропуски (в примере — с 3 и 7). -
web master
12 Март 2010 01:49:41 (ссылка)Pablo Monteagudo,
после небольших экспериментов вышло что то типа:
=====================================
SELECT
max(v)+1 as val
FROM
(
SELECT
t1.v,
(t1.v - (SELECT count(*) FROM test t2 WHERE t2.v<=t1.v)) as diff
FROM
test t1
) as t
GROUP BY
diff
HAVING
max(v)(SELECT max(t3.v) FROM test t3)
===================================== -
web master
12 Март 2010 01:52:36 (ссылка)к сожалению кривой движек скушал знак "неравно" в последнем HAVING поэтому заменил его на "!="
=======================================
SELECT
max(v)+1 as val
FROM
(
SELECT
t1.v,
(t1.v - (SELECT count(*) FROM test t2 WHERE t2.v<=t1.v)) as diff
FROM
test t1
) as t
GROUP BY
diff
HAVING
max(v)!=(SELECT max(t3.v) FROM test t3)
======================================= -
-
-
-
-
-
-
-
-
-
-
Saxa
07 Март 2011 22:38:49 (ссылка)Ну, например, вот такое решение (возможно есть получше):
1
SELECT t1.cust_id, t1.m, t1.rating FROM (SELECT cust_id, month(date) AS m, sum(summ_pay) AS rating FROM payments GROUP BY cust_id, month(date) ORDER BY month(date), sum(rate) DESC) AS t1 GROUP BY t1.m HAVING t1.rating=max(t1.rating)
-
-
-
Saxa
07 Март 2011 23:03:35 (ссылка)Не претендую на лучшее решение, но вот, что у меня получилось:
1. курсы валют:1 2 3 4 5 6
SELECT t2.currency, t2.date, t2.course FROM ( SELECT currency, max(date) AS last_date FROM currency_course GROUP BY currency ) AS t1, currency_course t2 WHERE t2.currency=t1.currency AND t1.last_date=t2.date;
2. Древовидные комментарии. Почитайте про nested sets, есть еще вариант с хранением пути от элемента до корня дерева, но nested sets получше будет.
3. Покупатели. См. выше.
-
-
-
-






