给定一个字母数字字符串str ,任务是按以下方式对字符串进行排序:如果一个位置被字母占据,则在排序后必须被一个字母占据;如果一个位置被数字占据,则必须在排序后被一个数字占据。
例子:
Input: str = “geeks12for32geeks”
Output: eeeef12ggk23korss
Input: str = “d4c3b2a1”
Output: a1b2c3d4
方法:我们将字符串转换为字符数组,然后对字符数组c []进行排序。对字符数组进行排序后,数字字符将占据数组的起始索引,字母将占据数组的其余部分。
数字一半将被排序,字母部分也将被排序。我们将保持两个指数一个字母部分al_c的开始索引和一个数字部分nu_c的开始索引,现在我们将检查原始字符串,如果位置是由一个字母占据然后我们会用C替换[ al_c]和增量al_c否则,我们将与C [nu_c]和增量nu_c更换。
下面是上述方法的实现:
C++
// C++ implementation of the approach
#include
using namespace std;
// Function that returns the string s
// in sorted form such that the
// positions of alphabets and numeric
// digits remain unchanged
string sort(string s)
{
char c[s.length() + 1];
// String to character array
strcpy(c, s.c_str());
// Sort the array
sort(c, c + s.length());
// Count of alphabets and numbers
int al_c = 0, nu_c = 0;
// Get the index from where the
// alphabets start
while (c[al_c] < 97)
al_c++;
// Now replace the string with sorted string
for (int i = 0; i < s.length(); i++) {
// If the position was occupied by an
// alphabet then replace it with alphabet
if (s[i] < 97)
s[i] = c[nu_c++];
// Else replace it with a number
else
s[i] = c[al_c++];
}
// Return the sorted string
return s;
}
// Driver code
int main()
{
string s = "d4c3b2a1";
cout << sort(s);
return 0;
}
Java
// A Java implementation of the approach
import java.util.*;
class GFG
{
// Function that returns the string s
// in sorted form such that the
// positions of alphabets and numeric
// digits remain unchanged
static String sort(String s)
{
char []c = new char[s.length() + 1];
// String to character array
c = s.toCharArray();
// Sort the array
Arrays.sort(c);
// Count of alphabets and numbers
int al_c = 0, nu_c = 0;
// Get the index from where the
// alphabets start
while (c[al_c] < 97)
al_c++;
// Now replace the string with sorted string
for (int i = 0; i < s.length(); i++)
{
// If the position was occupied by an
// alphabet then replace it with alphabet
if (s.charAt(i) < 97)
s = s.substring(0,i)+ c[nu_c++]+s.substring(i+1);
// Else replace it with a number
else
s = s.substring(0,i)+ c[al_c++]+s.substring(i+1);
}
// Return the sorted string
return s;
}
// Driver code
public static void main(String[] args)
{
String s = "d4c3b2a1";
System.out.println(sort(s));
}
}
/* This code contributed by PrinciRaj1992 */
Python3
# Python3 implementation of the approach
# Function that returns the string s
# in sorted form such that the
# positions of alphabets and numeric
# digits remain unchanged
def sort(s):
# String to character array
c, s = list(s), list(s)
# Sort the array
c.sort()
# Count of alphabets and numbers
al_c = 0
nu_c = 0
# Get the index from where the
# alphabets start
while ord(c[al_c]) < 97:
al_c += 1
# Now replace the string with sorted string
for i in range(len(s)):
# If the position was occupied by an
# alphabet then replace it with alphabet
if s[i] < 'a':
s[i] = c[nu_c]
nu_c += 1
# Else replace it with a number
else:
s[i] = c[al_c]
al_c += 1
# Return the sorted string
return ''.join(s)
# Driver Code
if __name__ == "__main__":
s = "d4c3b2a1"
print(sort(s))
# This code is contributed by
# sanjeev2552
C#
// C# implementation of the approach
using System;
class GFG
{
// Function that returns the string s
// in sorted form such that the
// positions of alphabets and numeric
// digits remain unchanged
static string sort(string s)
{
char []c = new char[s.Length + 1];
// String to character array
c = s.ToCharArray();
// Sort the array
Array.Sort(c);
// Count of alphabets and numbers
int al_c = 0, nu_c = 0;
// Get the index from where the
// alphabets start
while (c[al_c] < 97)
al_c++;
// Now replace the string with sorted string
for (int i = 0; i < s.Length; i++)
{
// If the position was occupied by an
// alphabet then replace it with alphabet
if (s[i] < 97)
s = s.Substring(0,i)+ c[nu_c++]+s.Substring(i+1);
// Else replace it with a number
else
s = s.Substring(0,i)+ c[al_c++]+s.Substring(i+1);
}
// Return the sorted string
return s;
}
// Driver code
public static void Main()
{
string s = "d4c3b2a1";
Console.WriteLine(sort(s));
}
}
/* This code contributed by AnkitRai01 */
输出:
a1b2c3d4
时间复杂度: O(N * log(N))其中N是字符串的长度。