给定一个包含N个非负整数的数组arr [] ,任务是在将每个数字转换为单词时,按字母顺序对这些整数进行排序。
例子:
Input: arr[] = {12, 10, 102, 31, 15}
Output: 15 102 10 31 12
Explanation:
The above set of numbers are sorted alphabetically. That is:
15 -> Fifteen
102 -> One hundred and two
10 -> Ten
31 -> Thirty-one
12 -> Twelve
Input: arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }
Output: 8 5 4 9 1 7 6 10 3 2
Explanation:
The above set of numbers are sorted alphabetically. That is:
8 -> eight
5 -> five
4 -> four
9 -> nine
1 -> one
7 -> seven
6 -> six
10 -> ten
3 -> three
2 -> two
方法:为了按字母顺序对数字进行排序,我们首先需要将数字转换为其字形。因此,其思想是将每个元素及其词形存储在向量对中,然后根据数字的对应词对向量的所有元素进行排序。所以:
- 将所有单位数字的字形预先计算并存储在数组中。
- 将所有十位数的单词形式预先计算并存储在另一个数组中。
- 对于所有其余的大于2位数字,将数字相除并添加单词形式。
- 遍历数组arr []中数字的每个数字,并将数字的相应单词形式成对存储在向量中。
- 遍历向量,并根据单词对向量进行排序。
- 最后,打印排序的顺序。
下面是上述方法的实现:
C++
// C++ program to sort an array of
// integers alphabetically
#include
using namespace std;
// Variable to store the word form of
// units digit and up to twenty
string one[]
= { "", "one ", "two ", "three ",
"four ", "five ", "six ",
"seven ", "eight ", "nine ", "ten ",
"eleven ", "twelve ", "thirteen ",
"fourteen ", "fifteen ", "sixteen ",
"seventeen ", "eighteen ", "nineteen " };
// Variable to store the word form of
// tens digit
string ten[]
= { "", "", "twenty ",
"thirty ", "forty ",
"fifty ", "sixty ",
"seventy ", "eighty ",
"ninety " };
// Function to convert a two digit number
// to the word by using the above defined arrays
string numToWords(int n, string s)
{
string str = "";
// If n is more than 19, divide it
if (n > 19)
str += ten[n / 10] + one[n % 10];
else
str += one[n];
// If n is non-zero
if (n)
str += s;
return str;
}
// Function to print a given number in words
string convertToWords(int n)
{
// Stores the word representation
// of the given number n
string out;
// Handles digits at ten millions
// and hundred millions places
out += numToWords((n / 10000000),
"crore ");
// Handles digits at hundred thousands
// and one millions places
out += numToWords(((n / 100000) % 100),
"lakh ");
// Handles digits at thousands and
// tens thousands places
out += numToWords(((n / 1000) % 100),
"thousand ");
// Handles digit at hundreds places
out += numToWords(((n / 100) % 10),
"hundred ");
if (n > 100 && n % 100)
out += "and ";
// Call the above function to convert
// the number into words
out += numToWords((n % 100), "");
return out;
}
// Function to sort the array according to
// the albhabetical order
void sortArr(int arr[], int n)
{
// Vector to store the number in words
// with respective elements
vector > vp;
// Inserting number in words
// with respective elements in vector pair
for (int i = 0; i < n; i++) {
vp.push_back(make_pair(
convertToWords(arr[i]), arr[i]));
}
// Sort the vector, this will sort the pair
// according to the alphabetical order.
sort(vp.begin(), vp.end());
// Print the sorted vector content
for (int i = 0; i < vp.size(); i++)
cout << vp[i].second << " ";
}
// Driver code
int main()
{
int arr[] = { 12, 10, 102, 31, 15 };
int n = sizeof(arr) / sizeof(arr[0]);
sortArr(arr, n);
return 0;
}
Python3
# Python3 program to sort an array of
# integers alphabetically
# Variable to store the word form of
# units digit and up to twenty
one = [ "", "one ", "two ", "three ",
"four ", "five ", "six ",
"seven ", "eight ", "nine ", "ten ",
"eleven ", "twelve ", "thirteen ",
"fourteen ", "fifteen ", "sixteen ",
"seventeen ", "eighteen ", "nineteen " ]
# Variable to store the word form of
# tens digit
ten = [ "", "", "twenty ",
"thirty ", "forty ",
"fifty ", "sixty ",
"seventy ", "eighty ",
"ninety " ]
# Function to convert a two digit number
# to the word by using the above defined arrays
def numToWords(n, s):
st = ""
# If n is more than 19, divide it
if (n > 19):
st += ten[n // 10] + one[n % 10]
else:
st += one[n]
# If n is non-zero
if (n):
st += s
return st
# Function to print a given number in words
def convertToWords(n):
# Stores the word representation
# of the given number n
out = ""
# Handles digits at ten millions
# and hundred millions places
out += numToWords((n // 10000000),
"crore ")
# Handles digits at hundred thousands
# and one millions places
out += numToWords(((n // 100000) % 100),
"lakh ")
# Handles digits at thousands and
# tens thousands places
out += numToWords(((n // 1000) % 100),
"thousand ")
# Handles digit at hundreds places
out += numToWords(((n // 100) % 10),
"hundred ")
if (n > 100 and n % 100):
out += "and "
# Call the above function to convert
# the number into words
out += numToWords((n % 100), "")
return out
# Function to sort the array according to
# the albhabetical order
def sortArr(arr, n):
# Vector to store the number in words
# with respective elements
vp = []
# Inserting number in words
# with respective elements in vector pair
for i in range(n):
vp.append((convertToWords(arr[i]),
arr[i]));
# Sort the vector, this will sort the pair
# according to the alphabetical order.
vp.sort()
# Print the sorted vector content
for i in range(len(vp)):
print (vp[i][1], end = " ")
# Driver code
if __name__ == "__main__":
arr = [ 12, 10, 102, 31, 15 ]
n = len(arr)
sortArr(arr, n)
# This code is contributed by chitranayal
15 102 10 31 12
时间复杂度: O(N * log(N)) ,其中N是数组的大小