📌  相关文章
📜  排序字符串数组移除其频率字符之后排序的每个字符串之后是不是2的功率

📅  最后修改于: 2021-04-17 19:26:02             🧑  作者: Mango

给定一个由N个字符串组成的数组arr [] ,任务是在修改每个字符串,通过删除所有非2的幂次幂的字符,以升序对数组进行排序,然后以降序对修改后的字符串进行排序。

例子:

方法:可以通过使用哈希存储每个字符串的所有字符的频率,然后执行给定的操作来解决给定的问题。请按照以下步骤解决问题:

  • 遍历给定的字符串数组arr [] ,并对每个字符串执行以下操作:
    • 将每个字符的频率存储在地图中。
    • 创建一个空字符串,例如T ,以存储修改后的字符串。
    • 现在遍历该地图,并将频率为2的幂的字符附加到字符串T上
    • 对字符串T进行升序排序,然后将其添加到字符串res []的数组中。
  • 对数组res []进行升序排序。
  • 完成上述步骤后,打印在阵列RES []作为结果的字符串。

下面是上述方法的实现:

C++
// C++ program for the above approach
 
#include 
using namespace std;
 
// Function to check if N is power of
// 2 or not
bool isPowerOfTwo(int n)
{
    // Base Case
    if (n == 0)
        return false;
 
    // Return true if N is power of 2
    return (ceil(log2(n))
            == floor(log2(n)));
}
 
// Function to print array of strings
// in ascending order
void printArray(vector res)
{
    // Sort strings in ascending order
    sort(res.begin(), res.end());
 
    // Print the array
    for (int i = 0; i < res.size(); i++) {
        cout << res[i] << " ";
    }
}
 
// Function to sort the strings after
// modifying each string according to
// the given conditions
void sortedStrings(string S[], int N)
{
    // Store the frequency of each
    // characters of the string
    unordered_map freq;
 
    // Stores the required
    // array of strings
    vector res;
 
    // Traverse the array of strings
    for (int i = 0; i < N; i++) {
 
        // Temporary string
        string st = "";
 
        // Stores frequency of each
        // alphabet of the string
        for (int j = 0;
             j < S[i].size(); j++) {
 
            // Update frequency of S[i][j]
            freq[S[i][j]]++;
        }
 
        // Traverse the map freq
        for (auto i : freq) {
 
            // Check if the frequency
            // of i.first is a power of 2
            if (isPowerOfTwo(i.second)) {
 
                // Update string st
                for (int j = 0;
                     j < i.second; j++) {
                    st += i.first;
                }
            }
        }
 
        // Clear the map
        freq.clear();
 
        // Null string
        if (st.size() == 0)
            continue;
 
        // Sort the string in
        // descending order
        sort(st.begin(), st.end(),
             greater());
 
        // Update res
        res.push_back(st);
    }
 
    // Print the array of strings
    printArray(res);
}
 
// Driver Code
int main()
{
    string arr[] = { "aaacbb", "geeks", "aaa" };
    int N = sizeof(arr) / sizeof(arr[0]);
    sortedStrings(arr, N);
 
    return 0;
}


Java
// Java program for the above approach
import java.io.*;
import java.lang.*;
import java.util.*;
 
class GFG{
 
// Function to check if N is power of
// 2 or not
static boolean isPowerOfTwo(int n)
{
     
    // Base Case
    if (n == 0)
        return false;
 
    // Return true if N is power of 2
    return (Math.ceil(Math.log(n) / Math.log(2)) ==
           Math.floor(Math.log(n) / Math.log(2)));
}
 
// Function to print array of strings
// in ascending order
static void printArray(ArrayList res)
{
     
    // Sort strings in ascending order
    Collections.sort(res);
 
    // Print the array
    for(int i = 0; i < res.size(); i++)
    {
        System.out.print(res.get(i) + " ");
    }
}
 
// Function to sort the strings after
// modifying each string according to
// the given conditions
static void sortedStrings(String S[], int N)
{
     
    // Store the frequency of each
    // characters of the string
    HashMap freq = new HashMap<>();
 
    // Stores the required
    // array of strings
    ArrayList res = new ArrayList<>();
 
    // Traverse the array of strings
    for(int i = 0; i < N; i++)
    {
         
        // Temporary string
        String st = "";
 
        // Stores frequency of each
        // alphabet of the string
        for(int j = 0; j < S[i].length(); j++)
        {
             
            // Update frequency of S[i][j]
            freq.put(S[i].charAt(j),
                freq.getOrDefault(S[i].charAt(j), 0) + 1);
        }
 
        // Traverse the map freq
        for(char ch : freq.keySet())
        {
             
            // Check if the frequency
            // of i.first is a power of 2
            if (isPowerOfTwo(freq.get(ch)))
            {
 
                // Update string st
                for(int j = 0; j < freq.get(ch); j++)
                {
                    st += ch;
                }
            }
        }
 
        // Clear the map
        freq.clear();
 
        // Null string
        if (st.length() == 0)
            continue;
 
        // Sort the string in
        // descending order
        char myCharArr[] = st.toCharArray();
        Arrays.sort(myCharArr);
        String ns = "";
         
        for(int j = myCharArr.length - 1; j >= 0; --j)
            ns += myCharArr[j];
 
        // Update res
        res.add(ns);
    }
     
    // Print the array of strings
    printArray(res);
}
 
// Driver Code
public static void main(String[] args)
{
    String arr[] = { "aaacbb", "geeks", "aaa" };
    int N = arr.length;
     
    sortedStrings(arr, N);
}
}
 
// This code is contributed by Kingash


输出:
cbb skgee

时间复杂度: O(N * log N + M * log M),其中M是S []中字符串的最大长度
辅助空间: O(N)