根据字符的ASCII值对字符串进行排序
ASCII值
ASCII(美国信息交换标准代码)是计算机和互联网上文本数据最常用的字符编码格式。在标准ASCII编码数据中,有256个字母、数字或特殊附加字符和控制代码的唯一值。
问题陈述
现在,在这个问题中,我们需要根据字符的ASCII值按升序找到排序后的字符串,其中字符串将是用户给我们的输入。让我们看看我们应该如何解决这个问题。
让我们通过一些例子来理解这个问题。
输入
s = "$%7wjk()"
输出
“$%()7jkw”
解释 − 给定字符串的字符的ASCII值如下所示 −
$ → 36 % → 37 ( → 40 ) → 41 7 → 55 j → 106 k → 107 w → 119
因此,根据ASCII码值升序排列,字符串将变为“$%()7jkw”。
输入
s = "#m 0f)nk"
输出
“#)0fkmn”
解释 − 给定字符串的字符的ASCII值如下所示 −
(space) → 32 # → 35 ) → 41 0 → 48 f → 102 k → 107 m → 109 n → 110
因此,根据ASCII码值升序排列,字符串将变为“#)0fkmn”。
问题说明
让我们尝试理解这个问题并找到它的解决方案。我们知道ASCII表中有256个字符,每个字符都有一个唯一的值或位置。所以我们的基本目标是相应地对字符进行排序。我们可以使用内置排序函数,也可以使用外部函数来实现我们的目标。另一种方法是创建一个频率向量,并将每个字符的频率存储在该数组中。使用这个频率向量和ASCII值,我们可以得到新的字符串。
方法一:使用频率向量
算法
创建一个大小为256的频率向量,因为ASCII表中的字符总数为256,并将整个向量初始化为零。
运行一个循环来存储给定字符串中每个字符的频率。
现在定义一个最初为空的输出字符串。
运行另一个循环遍历频率向量,因此我们可以通过将第i个位置的frequency_vector[i]强制类型转换为相应的字符来得到输出字符串。
将输出字符串作为最终结果返回。
示例
以下是上述方法在C++语言中的实现 −
#include <bits/stdc++.h> using namespace std; // Function to Sort the string as per ASCII values of the characters string Helper(string s){ // Define the size of the given string int size = s.length(); // Define a frequency vector of size 256, which is the same as the size of the characters as per the ASCII table, and initiate the value of the vector as 0 vector<int> v(256, 0); // Run a loop to count the frequency of each character of the string for (int i = 0; i < size; i++) { v[s[i]]++; } // Declare a string, initially empty, to find the final output string ans = ""; // Run another loop to get the final output in accordance with the ASCII table for (int i = 0; i < 256; i++) { for (int j = 0; j < v[i]; j++) // Typecast the integer value to the character value to include it in the loop ans = ans + (char)i; } // Return the final output return ans; } int main(){ // Give input as a string by the user string s = "$%7wjk()"; // Call Helper function to perform the remaining tasks cout<< "The sorted string as per ASCII values of the characters is: " << Helper(s); return 0; }
输出
The sorted string as per ASCII values of the characters is: $%()7jkw
上述代码的复杂度
时间复杂度 − O(n); 其中n是字符串的大小。这里,实际的时间复杂度是O(n * 256),但我们可以将其视为O(n),因为256可以被视为常数,例如k,而O(k * n)仅被视为O(n)。
空间复杂度 − O(256); 因为这里唯一额外占用的空间是频率数组的空间,其大小为256。
方法二:使用内置排序函数的解决方案
算法
定义一个外部比较函数,该函数将用于排序函数中,以根据ASCII值对字符进行排序,即返回其int强制类型转换值小于其他字符的字符。
现在,在辅助函数中使用内置排序函数,并使用一个额外的参数,即比较函数来正确获取顺序。
调用辅助函数并获取最终的字符串输出。
示例
以下是上述方法在各种编程语言中的实现 −
#include <stdio.h> #include <stdlib.h> #include <stdbool.h> #include <string.h> // Comparison Function to sort the string as per ASCII values of the characters int comparison(const void* a, const void* b){ return (*(char*)a - *(char*)b); } // Function to sort the string as per ASCII values of the characters void Helper(char* s){ size_t len = strlen(s); qsort(s, len, sizeof(char), comparison); } int main(){ // Give input as a string by the user char s[] = "$%7wjk()"; // Call Helper function to perform the sorting Helper(s); printf("The sorted string as per ASCII values of the characters is: %s", s); return 0; }
输出
The sorted string as per ASCII values of the characters is: $%()7jkw
#include <bits/stdc++.h> using namespace std; // Comparison Function to sort the string as per ASCII values of the characters bool comparison(char ch1, char ch2){ return int(ch1) <= int(ch2); } // Function to sort the string as per ASCII values of the characters string Helper(string s){ // Sort the string s with the help of the inbuilt function sort() sort(s.begin(), s.end(), comparison); // Return the final output string s return s; } int main(){ // Give input as a string by the user string s = "$%7wjk()"; // Call Helper function to perform the remaining tasks cout<< "The sorted string as per ASCII values of the characters is: " << Helper(s); return 0; }
输出
The sorted string as per ASCII values of the characters is: $%()7jkw
# Comparison Function to sort the string as per ASCII values of the characters def comparison(ch1, ch2): return ord(ch1) <= ord(ch2) # Function to sort the string as per ASCII values of the characters def Helper(s): # Sort the string s using the sorted() function and the custom comparison function s = ''.join(sorted(s, key=lambda x: ord(x))) return s # Give input as a string by the user s = "$%7wjk()" # Call Helper function to perform the remaining tasks print("The sorted string as per ASCII values of the characters is:", Helper(s))
输出
The sorted string as per ASCII values of the characters is: $%()7jkw
上述代码的复杂度
时间复杂度 − O(n log n); 众所周知,内置排序函数需要O(n * log(n))的时间来执行代码。在这个方法中,我们使用了一个额外的比较函数来使用内置排序函数,该函数将根据该函数对我们的字符进行排序。
空间复杂度 − O(1); 我们没有在上述代码中将任何变量存储在某些数据结构中。
结论
在本文中,为了根据字符的ASCII值按升序查找排序后的字符串。我们可以通过两种方法解决这个问题。首先,我们可以创建一个大小为256(与ASCII表中的字符数相同)的频率向量,并存储每个字符的所有频率,然后通过从后向前遍历,我们可以得到所需的字符串。另一种方法是在内置排序函数的帮助下,通过在排序函数中传递一个额外的参数来实现。