📜  按升序对罗马数字数组进行排序

📅  最后修改于: 2021-05-17 20:08:39             🧑  作者: Mango

给定N个罗马数字的数组arr [] ,任务是按升序对这些罗马数字进行排序。

例子:

方法:解决此问题的想法是将每个元素的罗马到整数值存储在向量对中,然后根据存储的罗马到整数值对向量的所有元素进行排序。

  • 迭代给定的罗马数字。
  • 将罗马数字转换为小数,然后将它们成对存储在向量中。
  • 根据存储在其中的十进制数字对向量进行排序。
  • 最后,按排序顺序打印罗马数字。

下面是上述方法的实现:

C++
// C++ program to sort an array of
// Roman Numerals in ascending order
 
#include 
using namespace std;
 
// Function to return the value
// of a Roman symbol
int value(char r)
{
    // I in roman is equal to
    // 1 in decimal
    if (r == 'I')
        return 1;
 
    // V in roman is equal to
    // 5 in decimal
    if (r == 'V')
        return 5;
 
    // X in roman is equal to
    // 10 in decimal
    if (r == 'X')
        return 10;
 
    // L in roman is equal to
    // 50 in decimal
    if (r == 'L')
        return 50;
 
    // C in roman is equal to
    // 100 in decimal
    if (r == 'C')
        return 100;
 
    // D in roman is equal to
    // 500 in decimal
    if (r == 'D')
        return 500;
 
    // M in roman is equal to
    // 1000 in decimal
    if (r == 'M')
        return 1000;
 
    return -1;
}
 
// Function to return the decimal value
// of a roman numaral
int romanToDecimal(string& str)
{
    // Initialize result
    int res = 0;
 
    // Traverse given input
    for (int i = 0; i < str.length(); i++) {
 
        // Getting value of symbol s[i]
        int s1 = value(str[i]);
 
        if (i + 1 < str.length()) {
 
            // Getting value of symbol s[i+1]
            int s2 = value(str[i + 1]);
 
            // Comparing both values
            if (s1 >= s2) {
 
                // Value of current symbol
                // is >= the next symbol
                res = res + s1;
            }
            else {
 
                // Value of current symbol
                // is < the next symbol
                res = res + s2 - s1;
                i++;
            }
        }
        else {
            res = res + s1;
        }
    }
    return res;
}
 
// Function to sort the array according to
// the increasing order
void sortArr(string arr[], int n)
{
    // Vector to store the roman to integer
    // with respective elements
    vector > vp;
 
    // Inserting roman to integer
    // with respective elements in vector pair
    for (int i = 0; i < n; i++) {
        vp.push_back(make_pair(
            romanToDecimal(
                arr[i]),
            arr[i]));
    }
 
    // Sort the vector, this will sort the pair
    // according to the increasing order.
    sort(vp.begin(), vp.end());
 
    // Print the sorted vector content
    for (int i = 0; i < vp.size(); i++)
        cout << vp[i].second << " "
             << vp[i].first << "\n";
}
 
// Driver code
int main()
{
    string arr[] = { "MCMIV", "MIV",
                     "MCM", "MMIV" };
    int n = sizeof(arr) / sizeof(arr[0]);
 
    sortArr(arr, n);
 
    return 0;
}


Java
// Java program to sort an array of
// Roman Numerals in ascending order
import java.io.*;
import java.util.*;
 
// User defined Pair class
class Pair
{
    int x;
    String y;
     
    public Pair(int a, String b)
    {
        this.x = a;
        this.y = b;
    }
}
 
// Class to define user defined conparator
class Compare
{
    static void compare(ArrayList vp)
    {
         
        // Comparator to sort the pair according
        // to first element
        Collections.sort(vp, new Comparator()
        {
            @Override public int compare(Pair p1, Pair p2)
            {
                return p1.x - p2.x;
            }
        });
    }
}
 
class GFG{
 
// Function to return the value
// of a Roman symbol
static int value(char r)
{
     
    // I in roman is equal to
    // 1 in decimal
    if (r == 'I')
        return 1;
 
    // V in roman is equal to
    // 5 in decimal
    if (r == 'V')
        return 5;
 
    // X in roman is equal to
    // 10 in decimal
    if (r == 'X')
        return 10;
 
    // L in roman is equal to
    // 50 in decimal
    if (r == 'L')
        return 50;
 
    // C in roman is equal to
    // 100 in decimal
    if (r == 'C')
        return 100;
 
    // D in roman is equal to
    // 500 in decimal
    if (r == 'D')
        return 500;
 
    // M in roman is equal to
    // 1000 in decimal
    if (r == 'M')
        return 1000;
 
    return -1;
}
 
// Function to return the decimal value
// of a roman numaral
static int romanToDecimal(String str)
{
     
    // Initialize result
    int res = 0;
 
    // Traverse given input
    for(int i = 0; i < str.length(); i++)
    {
         
        // Getting value of symbol s[i]
        int s1 = value(str.charAt(i));
 
        if (i + 1 < str.length())
        {
             
            // Getting value of symbol s[i+1]
            int s2 = value(str.charAt(i + 1));
 
            // Comparing both values
            if (s1 >= s2)
            {
                 
                // Value of current symbol
                // is >= the next symbol
                res = res + s1;
            }
            else
            {
                 
                // Value of current symbol
                // is < the next symbol
                res = res + s2 - s1;
                i++;
            }
        }
        else
        {
            res = res + s1;
        }
    }
    return res;
}
 
// Function to sort the array according to
// the increasing order
static void sortArr(String[] arr, int n)
{
     
    // Vector to store the roman to integer
    // with respective elements
    ArrayList vp = new ArrayList();
 
    // Inserting roman to integer
    // with respective elements in vector pair
    for(int i = 0; i < n; i++)
    {
        vp.add(new Pair(romanToDecimal(arr[i]),
                                       arr[i]));
    }
 
    // Sort the vector, this will sort the pair
    // according to the increasing order.
    Compare obj = new Compare();
    obj.compare(vp);
 
    // Print the sorted vector content
    for(int i = 0; i < vp.size(); i++)
        System.out.println(vp.get(i).y + " " +
                           vp.get(i).x + "\n");
}
 
// Driver Code
public static void main(String[] args)
{
    String arr[] = { "MCMIV", "MIV", "MCM", "MMIV" };
    int n = arr.length;
 
    sortArr(arr, n);
}
}
 
// This code is contributed by akhilsaini


Python3
# Python3 program to sort an array of
# Roman Numerals in ascending order
 
# Function to return the value
# of a Roman symbol
def value(r):
 
    # I in roman is equal to
    # 1 in decimal
    if (r == 'I'):
        return 1
 
    # V in roman is equal to
    # 5 in decimal
    if (r == 'V'):
        return 5
 
    # X in roman is equal to
    # 10 in decimal
    if (r == 'X'):
        return 10
         
    # L in roman is equal to
    # 50 in decimal
    if (r == 'L'):
        return 50
 
    # C in roman is equal to
    # 100 in decimal
    if (r == 'C'):
        return 100
 
    # D in roman is equal to
    # 500 in decimal
    if (r == 'D'):
        return 500
 
    # M in roman is equal to
    # 1000 in decimal
    if (r == 'M'):
        return 1000
 
    return -1
 
# Function to return the decimal value
# of a roman numaral
def romanToDecimal(st):
 
    # Initialize result
    res = 0
 
    # Traverse given input
    i = 0
    while i < len(st):
 
        # Getting value of symbol s[i]
        s1 = value(st[i])
 
        if (i + 1 < len(st)):
 
            # Getting value of symbol s[i+1]
            s2 = value(st[i + 1])
 
            # Comparing both values
            if (s1 >= s2):
 
                # Value of current symbol
                # is >= the next symbol
                res = res + s1
             
            else :
 
                # Value of current symbol
                # is < the next symbol
                res = res + s2 - s1
                i += 1
         
        else :
            res = res + s1
             
        i += 1
     
    return res
 
# Function to sort the array according to
# the increasing order
def sortArr(arr, n):
 
    # Vector to store the roman to integer
    # with respective elements
    vp = {}
 
    # Inserting roman to integer
    # with respective elements in vector pair
    for i in range(n):
        p = romanToDecimal(arr[i])
        vp[p] = arr[i]
 
    # Sort the vector, this will sort the pair
    # according to the increasing order.
    for i in sorted(vp):
        print(vp[i], i)
 
# Driver code
if __name__ == "__main__":
     
    arr = [ "MCMIV", "MIV",
            "MCM", "MMIV" ]
    n = len(arr)
 
    sortArr(arr, n)
 
# This code is contributed by chitranayal


C#
// C# program to sort an array of
// Roman Numerals in ascending order
using System;
using System.Collections;
using System.Collections.Generic;
 
class ABC : IComparer
{
    public int Compare(Pair p1, Pair p2)
    {
        if (p1.x == 0 || p2.x == 0)
        {
            return 0;
        }
           
        // CompareTo() method
        return p1.x.CompareTo(p2.x);
    }
}
 
// User defined Pair class
public class Pair
{
    public int x;
    public string y;
     
    public Pair(int a, string b)
    {
        this.x = a;
        this.y = b;
    }
}
 
class GFG{
     
// Function to return the value
// of a Roman symbol
static int value(char r)
{
     
    // I in roman is equal to
    // 1 in decimal
    if (r == 'I')
        return 1;
 
    // V in roman is equal to
    // 5 in decimal
    if (r == 'V')
        return 5;
 
    // X in roman is equal to
    // 10 in decimal
    if (r == 'X')
        return 10;
 
    // L in roman is equal to
    // 50 in decimal
    if (r == 'L')
        return 50;
 
    // C in roman is equal to
    // 100 in decimal
    if (r == 'C')
        return 100;
 
    // D in roman is equal to
    // 500 in decimal
    if (r == 'D')
        return 500;
 
    // M in roman is equal to
    // 1000 in decimal
    if (r == 'M')
        return 1000;
 
    return -1;
}
 
// Function to return the decimal value
// of a roman numaral
static int romanToDecimal(string str)
{
     
    // Initialize result
    int res = 0;
 
    // Traverse given input
    for(int i = 0; i < str.Length; i++)
    {
         
        // Getting value of symbol s[i]
        int s1 = value(str[i]);
 
        if (i + 1 < str.Length)
        {
             
            // Getting value of symbol s[i+1]
            int s2 = value(str[i + 1]);
 
            // Comparing both values
            if (s1 >= s2)
            {
                 
                // Value of current symbol
                // is >= the next symbol
                res = res + s1;
            }
            else
            {
 
                // Value of current symbol
                // is < the next symbol
                res = res + s2 - s1;
                i++;
            }
        }
        else
        {
            res = res + s1;
        }
    }
    return res;
}
 
// Function to sort the array according to
// the increasing order
static void sortArr(String[] arr, int n)
{
     
    // Vector to store the roman to integer
    // with respective elements
    List vp = new List();
 
    // Inserting roman to integer
    // with respective elements in vector pair
    for(int i = 0; i < n; i++)
    {
        vp.Add(new Pair(romanToDecimal(arr[i]),
                                       arr[i]));
    }
 
    // Sort the vector, this will sort the pair
    // according to the increasing order.
    ABC gg = new ABC();
    vp.Sort(gg);
 
    // Print the sorted vector content
    for(int i = 0; i < vp.Count; i++)
        Console.WriteLine(vp[i].y + " " +
                          vp[i].x + "\n");
}
 
// Driver Code
static public void Main ()
{
     string[] arr = { "MCMIV", "MIV", "MCM", "MMIV" };
    int n = arr.Length;
 
    sortArr(arr, n);
}
}
 
// This code is contributed by akhilsaini


输出:
MIV 1004
MCM 1900
MCMIV 1904
MMIV 2004


时间复杂度: O(N * log(N)) ,其中N是数组中元素的数量。