Искать ошибки в коде — одно из важных умений программиста. В нашем совместном с Альфа-банком проекте читателям предлагается замечательный тест в специальном жанре: задачи на минимальное исправление ошибок. Что это такое? Перед вами есть код, он работает, но работает неправильно. Чтобы его исправить, его нужно поправить совсем чуть-чуть, а именно: переименовать один символ, поменять два символа в внутри одной строки местами или поменять местами две строки кода. То есть, по сути, никакого нового кода писать не надо — только манипулировать с уже имеющимся, да и то совсем немного. Как и в случае нашего прошлого теста с Альфа-банком, в конце вы можете оставить почту. Лучших пригласят на собеседование.
Правила теста просты: перед вами семь карточек с кодом и поле, куда нужно вписать ответ. Как уже говорилось, все задачи на минимальное исправление, то есть нужно либо переименовать один символ в одной строке, либо поменять два символа местами в одной строке, либо поменять местами две строки.
Предположим, вы нашли строку, которую хотите исправить. Например:
1 правильно процитируйте пыхтелку из «Винни-Пуха»
2 если я чешу в затылке
3 не беда
4 в голове моей опилке
5 да-да-да!
4: в голове моей опилки
Обратите внимание, что после номера строки, в которую вы вносите изменения, ставится двоеточие и пробел. Теперь что делать, если вы хотите поменять две строки местами. Например:
1 правильно процитируйте пыхтелку из «Винни-Пуха»
2 мишка очень любит мед
3 в самом деле почему
4 почему, кто поймет
5 мед так нравится ему
3: почему, кто поймет
4: в самом деле, почему
Снова заметьте, что после номера строки идет двоеточие, а строки разделены переносом строки. А, и еще: если строчки кода не помещаются в окошко, ничего страшного: его можно скролить вправо. Ну вот, кажется, и все. Вы готовы к испытаниям, можете приступать.
// Нужно найти минимальный элемент в массиве.
// Сейчас всегда выдает очень большое число
func min(_ array: [Int]) -> Int {
var minElement = Int.max
for i in 0 ..< array.count {
if (array[i] > minElement) {
minElement = array[i]
}
}
return minElement
}
// Степень тройки
func isPowerOfThree(_ n: Int) -> Bool {
if n <= 0 {
return false
}
var m = n
while m % 3 == 0 {
m /= 3
}
return n == 1
}
// Метод должен сортировать строку по возрастанию( abcde...z )
// Сейчас сортирует по убыванию
- (NSString *)sortedString:(NSString *)inputString {
NSMutableArray *charArray = [NSMutableArray new];
for (int i = 0; i < inputString.length; ++i) {
[charArray addObject:[NSString stringWithFormat:@"%c", [inputString characterAtIndex:i]]];
}
NSString *resultString = [[charArray sortedArrayUsingComparator:^NSComparisonResult(id _Nonnull obj2, id _Nonnull obj1) {
return [obj1 compare:obj2];
}] componentsJoinedByString:@""];
return resultString;
}
// Ищем, содержит ли массив повторяющиеся значения
// Сейчас не работает
func containsDuplicate(_ nums: [Int]) -> Bool {
var set = Set<Int>()
for num in nums {
if (set.insert(num).inserted == false) {
return false
}
}
return true
}
// Нужно развернуть строку.
// Сейчас из строки abcd получается строка dccd.
func reverseString(_ s: String) -> String {
var helperString = Array(s.characters)
let length = s.characters.count
for i in 0 ..< (length / 2) {
let rightIndex = length - i - 1
let tmp = helperString[rightIndex]
helperString[i] = tmp
helperString[rightIndex] = helperString[i]
}
return String(helperString)
}
// Найти длину самой длинной увеличивающейся подпоследовательности.
func lengthOfLIS(_ nums: [Int]) -> Int {
var lengths = [Int](repeatElement(1, count: nums.count))
var maxLength = 0
for i in 0 ..< nums.count {
for j in 0 ..< i {
if (nums[j] < nums[i]) {
lengths[i] = max(lengths[i] + 1, lengths[j])
}
}
maxLength = max(maxLength, lengths[i])
}
return maxLength
}
// Найти длину самой длинной подстроки без повторяющихся символов.
func lengthOfLongestSubstring(_ s: String) -> Int {
let n = s.characters.count
let charsString = s.utf8CString
var set = Set<String>()
var i = 0
var j = 0
var answer = 0
while i < n && j < n {
let currentCharRight = String(charsString[j])
let currentCharLeft = String(charsString[i])
if (set.contains(currentCharRight) == false) {
set.insert(currentCharRight)
answer = max(answer, j - i + 1)
i += 1
} else {
set.remove(currentCharLeft)
j += 1
}
}
return answer
}