给定N个罗马数字的数组arr [] ,任务是按升序对这些罗马数字进行排序。
例子:
Input: arr[] = { “MCMIV”, “MIV”, “MCM”, “MMIV” }
Output: MIV MCM MCMIV MMIV
Explanation:
The roman numerals in their corresponding decimal system are:
MIV: 1004
MCM: 1900
MCMIV: 1904
MMIV: 2004
Input: arr = { “MV”, “MIV”, “MCM”, “MM” }
Output: MIV MV MCM MM
Explanation:
The roman numerals in their corresponding decimal system are:
MIV 1004
MV 1005
MCM 1900
MM 2000
方法:解决此问题的想法是将每个元素的罗马到整数值存储在向量对中,然后根据存储的罗马到整数值对向量的所有元素进行排序。
- 迭代给定的罗马数字。
- 将罗马数字转换为小数,然后将它们成对存储在向量中。
- 根据存储在其中的十进制数字对向量进行排序。
- 最后,按排序顺序打印罗马数字。
下面是上述方法的实现:
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是数组中元素的数量。