Dada una serie de strings de fechas [] , la tarea es ordenar estas fechas en orden ascendente.
Nota: Cada fecha tiene la forma dd mmm aaaa donde:
- El dominio de dd es [0-31] .
- El dominio de mmm es [ene, feb, mar, abr, may, jun, jul, ago, sep, oct, nov, dic] .
- Y, yyyy es un número entero de cuatro dígitos.
Ejemplos:
Entrada: fechas[] = {“01 de marzo de 2015”, “11 de abril de 1996”, “22 de octubre de 2007”}
Salida:
11 de abril de 1996
22 de octubre de 2007
01 de marzo de 2015
Entrada: fechas[] = {“03 de enero de 2018”, “ 02 de enero de 2018”, “04 de enero de 2017”}
Salida:
04 de enero de 2017
02 de enero de 2018
03 de enero de 2018
Enfoque: extraiga los días , meses y años como substrings de la string y luego compare dos strings por años ; si los años de dos fechas son iguales, compare sus meses . Si además los meses son iguales a los días se decidirá qué fecha aparece antes en el calendario.
A continuación se muestra la implementación del enfoque anterior:
CPP
// C++ program to sort the dates in a string array #include <bits/stdc++.h> using namespace std; // Map to store the numeric value of each month depending on // its occurrence i.e. Jan = 1, Feb = 2 and so on. unordered_map<string, int> monthsMap; // Function which initializes the monthsMap void sort_months() { monthsMap["Jan"] = 1; monthsMap["Feb"] = 2; monthsMap["Mar"] = 3; monthsMap["Apr"] = 4; monthsMap["May"] = 5; monthsMap["Jun"] = 6; monthsMap["Jul"] = 7; monthsMap["Aug"] = 8; monthsMap["Sep"] = 9; monthsMap["Oct"] = 10; monthsMap["Nov"] = 11; monthsMap["Dec"] = 12; } // Comparator function to sort an array of dates bool comp(string a, string b) { // Comparing the years string str1 = a.substr(7, 5); string str2 = b.substr(7, 5); if (str1.compare(str2) != 0) { if (str1.compare(str2) < 0) return true; return false; } // Comparing the months string month_sub_a = a.substr(3, 3); string month_sub_b = b.substr(3, 3); // Taking numeric value of months from monthsMap int month_a = monthsMap[month_sub_a]; int month_b = monthsMap[month_sub_b]; if (month_a != month_b) { return month_a < month_b; } // Comparing the days string day_a = a.substr(0, 2); string day_b = b.substr(0, 2); if (day_a.compare(day_b) < 0) return true; return false; } // Utility function to print the contents // of the array void printDates(string dates[], int n) { for (int i = 0; i < n; i++) { cout << dates[i] << endl; } } // Driver code int main() { string dates[] = { "24 Jul 2017", "25 Jul 2017", "11 Jun 1996", "01 Jan 2019", "12 Aug 2005", "01 Jan 1997" }; int n = sizeof(dates) / sizeof(dates[0]); // Order the months sort_months(); // Sort the dates sort(dates, dates + n, comp); // Print the sorted dates printDates(dates, n); }
Python3
# Python3 program to sort the dates in a string array # Map to store the numeric value of each month depending on # its occurrence i.e. Jan = 1, Feb = 2 and so on. monthsMap=dict() # Function which initializes the monthsMap def sort_months(): monthsMap["Jan"] = 1 monthsMap["Feb"] = 2 monthsMap["Mar"] = 3 monthsMap["Apr"] = 4 monthsMap["May"] = 5 monthsMap["Jun"] = 6 monthsMap["Jul"] = 7 monthsMap["Aug"] = 8 monthsMap["Sep"] = 9 monthsMap["Oct"] = 10 monthsMap["Nov"] = 11 monthsMap["Dec"] = 12 def cmp(date): date=date.split() return int(date[2]),monthsMap[date[1]],int(date[0]), # Utility function to print the contents # of the array def printDates(dates, n): for i in range(n): print(dates[i]) # Driver code if __name__ == '__main__': dates = [ "24 Jul 2017", "25 Jul 2017", "11 Jun 1996", "01 Jan 2019", "12 Aug 2005", "01 Jan 1997" ] n = len(dates) # Order the months sort_months() # Sort the dates dates.sort(key=cmp) # Print the sorted dates printDates(dates, n) # This code is contributed by Amartya Ghosh
11 Jun 1996 01 Jan 1997 12 Aug 2005 24 Jul 2017 25 Jul 2017 01 Jan 2019
Complejidad de tiempo : O(N * log(N))
Espacio auxiliar : O(1)