如何在将数字转换为文字的同时按字母顺序对数组进行排序?


引言

本教程将处理在将每个数字转换为文字的同时按字母顺序对数组进行排序的问题。将数字转换为文字意味着将数字更改为其数字名称。例如,65 是六十五。在这里,我们考虑一个数字数组,将所有数组元素转换为文字,并按字母顺序排列它们。转换文字回其各自的数字后,打印排序后的数组元素。

演示 1

Input = Arr = {13, 1, 6, 7}
Output = 1 7 6 13

解释

输入数组元素为 13、1、6、7

按字母顺序排列的输出元素为 1 7 6 13。转换为文字后的数字如下所示:

1 = one
7 = seven
6 = six
13 = thirteen

因此,所有数字都按其数字名称的字母顺序排序。

演示 2

Input = Ass = {17, 34, 65, 12, 10}
Output = 17 65 10 34 12 

解释

使用输入数组元素 {17, 34, 65, 12, 10},转换为文字后排序的数字为 17 65 10 34 12。这些数字的文字转换如下:

17 = Seventeen
65 = Sixty-five
10 = ten
34 = thirty-four
12 = twelve

因此,所有文字都按字母顺序排序。

C++ 库函数

  • sizeof - 它用于在编译时查找变量和数据类型的尺寸,因为它是一个编译时运算符。它是 C++ 中的关键字。

sizeof(value);
  • Vector - 它是 C++ 中的动态数组。其所有函数都在 <vector> 头文件中定义。它是用于存储元素而不预定义大小的数据结构之一。

vector<data_type> vector_name;
  • Map - 它是用于存储元素及其映射值和键值对的数据结构。其所有元素都与键值对相关联。键是唯一的,并以某种特定方式排序。

map <data_type> map_name;
  • vector.push_back() - 它是 <vector> 头文件中预定义的函数。它将元素推入或插入到向量的末尾。

vector_name.push_back(value);
  • vector.begin() - 它是 vector 头文件的预定义函数。它返回向量的起始位置。

vector_name.begin();
  • vector.end() - 它是 vector 头文件的预定义函数。它返回向量的结束位置。

vector_name.end();
  • size() - 它是标准 C++ 库函数。它返回输入字符串的长度。

string.size();
  • vector.sort() - 此向量类库函数按升序对向量元素进行排序。它采用参数对向量元素进行排序。

sort(vector_name.begin(), vector_name.end());

算法

  • 获取一个数字数组。

  • 将数组中的每个数字转换为文字。

  • 为了转换为文字,请考虑使用向量。

  • 将数字名称保存到向量中。

  • 迭代每个数字的向量以获取其文字形式。

  • 将每个数字转换为其文字后,按字母顺序对所有数字进行排序。

  • 打印排序后的数组元素。

示例 1

实现一种方法,使用数字名称按字母顺序对数组元素进行排序。声明向量以存储所有数字的文字。当代码找到大于两位数的数字时,它会分解数字并确定其文字。迭代所有向量以查找每个数字的文字。

#include <bits/stdc++.h>
using namespace std;

string ones[]  // storing words for the from 1 to 19
   = { "", "one ", "two ", "three ","four ", "five ", "six ","seven ", "eight ", "nine ", "ten ",
   "eleven ", "twelve ", "thirteen ","fourteen ", "fifteen ", "sixteen ","seventeen ", "eighteen ", "nineteen "};
string tens[]  // Variable for storing the words for the numbers multiple of 10 till 90
   = { "", "", "twenty ","thirty ", "forty ","fifty ", "sixty" ,"seventy ", "eighty ","ninety " };
   
// Function for finding the words for numbers that are not stored in the above variables
string wordsForNum(int a, string str) {   
   string s = "";
   if (a > 19)  // when a number os >19
      s += tens[a / 10] + ones[a % 10];
   else
      s += ones[a];
   if (a)    // when number is non-zero
      s += str;
   return s;
}

// Function for converting the numbers to words and printing them
string convertingToWords(int a)   {   
   string result;
   result += wordsForNum((a / 10000000),"crore ");
   result += wordsForNum(((a / 100000) % 100),"lakh ");     // storing greater numbers
   result += wordsForNum(((a / 1000) % 100),"thousand ");
   result += wordsForNum(((a / 100) % 10),"hundred ");
   if (a > 100 && a % 100)
      result += "and ";
   result += wordsForNum((a % 100), "");
   return result;
}

// Function for sorting the numbers alphabetically with their words
void sortingNum(int arrNum[], int a)  {   
   vector<pair<string, int> > vecNum;
   
   // adding or inserting the words for the numbers in the vector variable
   for (int x = 0; x < a; x++) {
      vecNum.push_back(make_pair(convertingToWords(arrNum[x]), arrNum[x]));
   }
   sort(vecNum.begin(), vecNum.end());
   for (int x = 0; x < vecNum.size(); x++)
      cout << vecNum[x].second << " ";     
}

int main() {   
   int arrNum[] = {17, 34, 65, 12, 10};
   int a = sizeof(arrNum) / sizeof(arrNum[0]);
   sortingNum(arrNum, a);
   return 0;
}

输出

17 65 10 34 12 

示例 2

在这种方法中,我们通过 C++ 将数组元素转换为文字后按字母顺序对它们进行排序。在这里,输出是按排序顺序排列的数字文字。使用映射来存储数字的文字。

#include <iostream>
#include <vector>
#include <algorithm>
#include <map>

using namespace std;
map<int, string> numNames = {  
   {0, "zero"}, {1, "one"}, {2, "two"}, {3, "three"}, {4, "four"}, {5, "five"}, {6, "six"}, {7, "seven"}, {8, "eight"}, {9, "nine"},{10, "ten"}, {11, "eleven"}, {12, "twelve"}, {13, "thirteen"}, {14, "fourteen"},{15, "fifteen"}, {16, "sixteen"}, {17, "seventeen"}, {18, "eighteen"}, {19, "nineteen"},{20, "twenty"}, {30, "thirty"}, {40, "forty"}, {50, "fifty"}, {60, "sixty"},{70, "seventy"}, {80, "eighty"}, {90, "ninety"} 
};

//function for converting number to words
string numToWords(int n)  {  
   if (n < 20) 
      return numNames[n];
   else if (n < 100) {   
      if (n % 10 == 0)
         return numNames[n]; 
      else
         return numNames[n / 10 * 10] + " " + numNames[n % 10];
   }
   else if (n < 1000){   
      if (n % 100 == 0)
         return numNames[n / 100] + " hundred";
      else
         return numNames[n / 100] + " hundred and " + numToWords(n % 100);
   }
   else
      return "Number out of range (0-999)";
}

int main() {  
   vector<int> number = {13, 1, 6, 7};// Define the array with predefined values
   
   vector<string> numNamesArray;  // Convert numbers to their corresponding names
   for (int n : number)
      numNamesArray.push_back(numToWords(n));
   sort(numNamesArray.begin(), numNamesArray.end());     // Sort the names alphabetically 
   cout << "Sorted array in alphabetical order with words : \n;
   for (const string& words : numNamesArray){
      cout << words << endl;
   }
   return 0;
}

输出

Sorted array in alphabetical order with words : 
one
seven
six
thirteen

结论

我们已经完成了本教程。在本教程中,我们根据数组元素的数字名称对数组元素进行了排序。所有数组元素都是正数。我们用示例演示了问题陈述,以详细说明任务的含义。

我们使用 C++ 来实现两种解决任务的方法,使用映射和向量来存储数组数字的文字。在一个输出中,我们打印了数组的按字母顺序排序的数字名称。

更新于:2023年10月3日

浏览量:114

开启您的 职业生涯

完成课程后获得认证

开始
广告