根据字符的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表中的字符数相同)的频率向量,并存储每个字符的所有频率,然后通过从后向前遍历,我们可以得到所需的字符串。另一种方法是在内置排序函数的帮助下,通过在排序函数中传递一个额外的参数来实现。

更新于:2024年1月22日

2K+ 次浏览

启动你的职业生涯

通过完成课程获得认证

开始
广告