ARTS-第7周-190429

本周刷了罗马文字转数字和数字转罗马文字两个有联系的算法题,介绍了罗马字和数字对照表及特殊情况处理,给出了几个测试用例,还分享了相关代码及不同思路下的执行速度情况,此外提到后续要完成Vue初步学习经历文章。

Algorithm
这周刷了两个有联系的算法题,一个是罗马文字转数字一个是数字转罗马文字。
Integer to Roman(数字转罗马字)
罗马字和数字对照表:

SymbolValue
I1
V5
X10
L50
C100
D500
M1000

当然有特殊情况需要处理:
I can be placed before V (5) and X (10) to make 4 and 9.
X can be placed before L (50) and C (100) to make 40 and 90.
C can be placed before D (500) and M (1000) to make 400 and 900.
这些特殊情况主要集中在遇到4和9的时候,例如:4 不是 IIII,而是表示为 IV,从顺序上看为5减1;相应的 9 不是 VIIII,而是 IX。40,90,400,900也是类似的情况。
几个测试用例:

Input: 3 Output: “III”
Input: 4 Output: “IV”
Input: 9 Output: “IX”
Input: 58 Output: “LVIII”
Input: 1994 Output: “MCMXCIV”

默认输入值的为int类型,范围为 1 到 3999.
代码:

public static string IntToRoman(int num)
{
   string result = "";
   int number = num / 1000;
   if (number > 0)
   {
       while (number>0)
       {
           result += "M";
           number--;
       }
   }
   number = num % 1000 / 100;
   if (number > 0)
   {
       if (number == 4)
       {
           result += "CD";
       }
       else if (number == 9)
       {
           result += "CM";
       }
       else
       {
           if (number >= 5)
           {
               result += "D";
               number -= 5;
           }
           while (number > 0)
           {
               result += "C";
               number--;
           }
       }

   }
   number = num % 100 / 10;
   if (number > 0)
   {
       if (number == 4)
       {
           result += "XL";
       }
       else if (number == 9)
       {
           result += "XC";
       }
       else
       {
           if (number >= 5)
           {
               result += "L";
               number -= 5;
           }
           while (number > 0)
           {
               result += "X";
               number--;
           }
       }
   }
   number = num % 10;
   if (number > 0)
   {
       if (number == 4)
       {
           result += "IV";
       }
       else if (number == 9)
       {
           result += "IX";
       }
       else
       {
           if (number >= 5)
           {
               result += "V";
               number -= 5;
           }
           while (number > 0)
           {
               result += "I";
               number--;
           }
       }
   }
   return result;
}

我这从千位开始判断,感觉有点奇怪,我也不知道当时是怎么想的。
再贴出来 罗马字转数字 的代码:

static public int RomanToInt(string s)
{
     int result = 0;
     Dictionary<char, int> dic_str = new Dictionary<char, int>() { { 'I', 1 }, { 'V', 5 }, { 'X', 10 }, { 'L', 50 }, { 'C', 100 }, { 'D', 500 }, { 'M', 1000 } };
     for(int i=0;i<s.Length;i++)
     {
         result += dic_str[s[i]];
         if (i>0 && dic_str[s[i]]> dic_str[s[i-1]])
         {
             result -= 2 * dic_str[s[i - 1]];
         }
     }
     return result;
 }

写完这两段代码以后,觉得数字转罗马字有新的思路,直接把每位数字对应的罗马字建立一张查询表,直接解析数字的每一位,发现速度也一般,至少比我预想的要慢:

public string IntToRoman(int num) {
	string[,] intToRomanArray = {
	    {"I","II","III","IV","V","VI","VII","VIII","IX"},
	    {"X","XX","XXX","XL","L","LX","LXX","LXXX","XC"},
	    {"C","CC","CCC","CD","D","DC","DCC","DCCC","CM"},
	    {"M","MM","MMM","","","","","",""}
	};
	string result = "";
	for(int i=0;i<4;i++)
	{
	   int temp = num%10;
	   if(temp>0){
	       result = intToRomanArray[i,temp-1]+result;
	   }
	   if(num/10>0){
	       num = num/10;
	   }else{
	       break;
	   }
	}
	return result;
}

看了下,执行速度比我快的代码,思路也类似,没太搞懂。也贴出来看下吧。

public class Solution {
    public string IntToRoman(int num) {
        
        string ans = "";
        int place = 0;
        while(num > 0)
        {
            int digit = num%10;
            
            ans = GetRomanNumberByPlace(digit,place) + ans;
            place += 1;
            num = num/10;
        }
        
        return ans;
    }
    
    private string GetRomanNumberByPlace(int number, int place)
    {
        if(place == 0)
        {
            string[] UnitsPlace = new string[]{"","I","II","III","IV","V","VI","VII","VIII","IX"};
            return UnitsPlace[number];
        }
        
        if(place == 1)
        {
            string[] TensPlace = new string[]{"","X","XX","XXX","XL","L","LX","LXX","LXXX","XC"};
            return TensPlace[number];
        }
        
        if(place == 2)
        {
            string[] HundredsPlace = new string[]{"","C","CC","CCC","CD","D","DC","DCC","DCCC","CM"};
            return HundredsPlace[number];
        }
        else
        {
            string[] ThousandsPlace = new string[]{"","M","MM","MMM"};
            return ThousandsPlace[number];
        }
        
    }
}

Review
空缺,五一以后一定要续命啊。
Tips&Share
短长假没能如期完成任务啊,这是要加班的前奏啊,Vue的初步学习经历下周要完工了,一定要提高文章质量。

内容概要:本文系统介绍了算术优化算法(AOA)的基本原理、核心思想及Python实现方法,并通过图像分割的实际案例展示了其应用价值。AOA是一种基于种群的元启发式算法,其核心思想来源于四则运算,利用乘除运算进行全局勘探,加减运算进行局部开发,通过数学优化器加速函数(MOA)和数学优化概率(MOP)动态控制搜索过程,在全局探索与局部开发之间实现平衡。文章详细解析了算法的初始化、勘探与开发阶段的更新策略,并提供了完整的Python代码实现,结合Rastrigin函数进行测试验证。进一步地,以Flask框架搭建前后端分离系统,将AOA应用于图像分割任务,展示了其在实际工程中的可行性与高效性。最后,通过收敛速度、寻优精度等指标评估算法性能,并提出自适应参数调整、模型优化和并行计算等改进策略。; 适合人群:具备一定Python编程基础和优化算法基础知识的高校学生、科研人员及工程技术人员,尤其适合从事人工智能、图像处理、智能优化等领域的从业者;; 使用场景及目标:①理解元启发式算法的设计思想与实现机制;②掌握AOA在函数优化、图像分割等实际问题中的建模与求解方法;③学习如何将优化算法集成到Web系统中实现工程化应用;④为算法性能评估与改进提供实践参考; 阅读建议:建议读者结合代码逐行调试,深入理解算法流程中MOA与MOP的作用机制,尝试在不同测试函数上运行算法以观察性能差异,并可进一步扩展图像分割模块,引入更复杂的预处理或后处理技术以提升分割效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值