Zadanie w programie Codewars: Ekstrakcja zakresu
Wymagania: Język C++, C++ 17
Format wyrażania uporządkowanej listy liczb całkowitych polega na użyciu listy oddzielonej przecinkami jednej z nich poszczególne liczby całkowite lub zakres liczb całkowitych oznaczony przez początkową liczbę całkowitą oddzieloną od końcowej liczby całkowitej w zakresie myślnikiem, „.
Zakres obejmuje wszystkie liczby całkowite w przedziale, w tym oba punkty końcowe. Nie jest uważany za zakres, chyba że obejmuje co najmniej 3 liczby. Na przykład: „12,13,15-17”
Uzupełnij rozwiązanie tak, aby pobierało listę liczb całkowitych w porządku rosnącym i zwracało prawidłowo sformatowany ciąg znaków w formacie zakresu.
Przykład:
range_extraction({-10, -9, -8, -6, -3, -2, -1, 0, 1, 3, 4, 5, 7, 8, 9, 10, 11, 14, 15, 17, 18, 19, 20});
// returns ”-10--8,-6,-3,-1,3-5,7-11,14,15,17-20"
Dzięki uprzejmości strony rosettacode.org
Odpowiedź:
Mam nadzieje, ze dobrze zrozumiałem polecenie, wrazie czego pisz komentarz
#include <iostream>
#include <vector>
#include <string>
std::string range_extraction(std::vector<int> nums) {
std::string result;
for (int i = 0; i < nums.size(); i++) {
if (i > 0) result += ","; // Dodaj przecinek przed każdą kolejną liczbą lub zakresem
result += std::to_string(nums[i]);
int j = i;
while (j + 1 < nums.size() && nums[j + 1] == nums[j] + 1) {
j++; // Znajdź koniec zakresu liczb
}
if (j > i + 1) {
result += "-" + std::to_string(nums[j]); // Dodaj zakres do wyniku
i = j; // Przeskocz przez przetworzone liczby
}
}
return result;
}
int main() {
std::vector<int> nums{-10, -9, -8, -6, -3, -2, -1, 0, 1, 3, 4, 5, 7, 8, 9, 10, 11, 14, 15, 17, 18, 19, 20};
std::cout << range_extraction(nums) << std::endl;
return 0;
}
Wyjaśnienie:
Kod działa w następujący sposób:
Przechodzimy przez wektor liczb całkowitych i dodajemy każdą liczbę do wyniku, oddzielając je przecinkiem.
Następnie szukamy każdego zakresu liczb, który zaczyna się od bieżącej liczby i kontynuuje się do kolejnych liczb z kolejnością o 1 większą.
Jeśli znajdziemy zakres o długości większej niż 2 liczby, dodajemy go do wyniku, oddzielając początkową i końcową liczbę w zakresie myślnikiem.
Przeskakujemy przez przetworzone liczby i kontynuujemy przeszukiwanie.
W powyższym przykładzie, funkcja range_extraction zostanie wywołana z wektorem liczb całkowitych {-10, -9, -8, -6, -3, -2, -1, 0, 1, 3, 4, 5, 7, 8, 9, 10, 11, 14, 15, 17, 18, 19, 20}. Oczekiwany wynik to "-10--8,-6,-3,-1,3-5,7-11,14,15,17-20". Funkcja zwróci ten sam wynik jako string.