对一串罗马数字进行排序

Posted

技术标签:

【中文标题】对一串罗马数字进行排序【英文标题】:Sort a string of Roman Numerals 【发布时间】:2017-03-27 22:22:19 【问题描述】:

输入将是一串必须按其值排序的罗马数字。此任务还必须使用 c++ 中的类来完成

到目前为止,我已经创建了我的类

#include<iostream>
#include<string>
using namespace std;

class RomanNumbers

public:
    RomanNumbers(string = "");

    void setRoman(string);

    int convertToDecimal();

    void printDecimal();

    void printRoman();


private:

    string roman;

    int decimal;

;

还有将数字从罗马数字转换为整数形式的函数,但我的问题是:我该如何对它们进行排序,因为我无法创建一个包含转换后的罗马数字的新字符串并对字符串进行排序。任何帮助将不胜感激。

#include<iostream>
#include<string>
#include "RomanNumbers.h"
using namespace std;

RomanNumbers::RomanNumbers(string myRoman)

    roman = myRoman;
    decimal = 0;


void RomanNumbers::setRoman(string myRoman)

    roman = myRoman;
    decimal = 0;


int RomanNumbers::convertToDecimal()

    enum romans  I = 1, V = 5, X = 10, L = 50, C = 100, D = 500, M = 1000 ;

    for (int i = 0; i < roman.size(); i++)
    
        switch (roman[i])
        

         case 'M': decimal += M; break;
         case 'D': decimal += D; break;
         case 'C': decimal += C; break;
         case 'L': decimal += L; break;
         case 'X': decimal += X; break;
         case 'V': decimal += V; break;

         case 'I':
             if (roman[i + 1] != 'I' && i + 1 != roman.size())
             
                 decimal -= 1;
             
             else
             
                 decimal += 1;
             
               break;

        
    

    return decimal;


void RomanNumbers::printRoman()

    cout << "Number in Roman form : " << roman;
    cout << endl;


void RomanNumbers::printDecimal()

    cout << "Number converted in integer form : " << decimal;

    cout << endl;

【问题讨论】:

您可以创建一个存储为std::pair&lt;int,std::string&gt; 的值的新数组/向量并对其进行排序,或者您可以将自定义排序谓词传递给std::sort,该谓词使用您的转换函数来比较值。 另请注意,您的转换不适用于 XC (90) 等数字 你能给我一段代码以便更好地理解吗? @paddy 我不确定您所说的“对字符串进行排序”是什么意思。您不想按 数字 排序吗?除非您进行字母排序(C、CC、CCC、CCCI、CCCII、CCCIII、CCCIV、CCCIX、CCCL、CCCLI 等)。 @Triple3XH:*** 上有很多关于此的现有问题。检查“运算符重载”。 【参考方案1】:

解决问题的一种方法是定义有意义的比较 operator&lt;/比较 lambda 表达式/比较类,然后与 sort 算法一起使用:

template <class RandomAccessIterator, class Compare>
void sort (RandomAccessIterator first, RandomAccessIterator last, Compare comp);

例如一个比较类是:

struct RomanComp 

    bool operator() const (const RomanNumbers& lhs, const RomanNumbers& rhs)
     
        return lhs.decimal < rhs.decimal;
    
 RomanComparator; // <--- note object instantiation

然后对一个罗马数字的向量进行排序,例如:

std::vector<RomanNumbers> nums;

std::sort(nums.begin(), nums.end(), RomanComparator);

假设:

#include <algorithm>    // std::sort
#include <vector>       // std::vector

【讨论】:

或者只是将该运算符定义为'operator @CrisLuengo 我试图重载运算符 friend ostream& operator <<(ostream &os, const RomanNumbers &r) return (os << r.printRoman); 但它再次不起作用,所以如果你有更好的代码解决方案,请告诉我

以上是关于对一串罗马数字进行排序的主要内容,如果未能解决你的问题,请参考以下文章

JS-对一串数字每三位加上逗号

Excel:如何像数据透视表一样对一系列带有前导零的数字进行排序?

面试难题:用有限的内存对一百万个数字输入进行排序

怎样把一串数字字符串的后四位换成****?

在JAVA里,对一组数字进行从小到大排序,是否直接调用类,调用对象方法,直接排就行了。

Python 输入一串数字,对其排序或找寻max或min值