今天做的習(xí)題是Roman to Integer的LeetCode,比較簡單,重點(diǎn)是轉(zhuǎn)換規(guī)則要用好,其他就沒有什么了。但做完題之后還是不太明白為什么要用這個(gè)算法。
思路為:1:將字符串轉(zhuǎn)換為字符數(shù)組
2:對(duì)字符數(shù)組的每一個(gè)符號(hào)進(jìn)行判斷如果大于前一個(gè)符號(hào)則加上如果小于則加上后一個(gè)符號(hào)并且減去兩倍的此符號(hào)
具體代碼如下:
public class Solution { public int romanToInt(String s) { int graph[] = new int[400]; graph['I'] = 1; graph['V']=5; graph['X']=10; graph['L']=50; graph['C']=100; graph['D']=500; graph['M']=1000; char[] romanNum=s.toCharArray(); int sum=graph[romanNum[0]]; for(int i=0;i<romanNum.length-1;i++){ if(graph[romanNum[i]]>=graph[romanNum[i+1]]) sum+=graph[romanNum[i+1]]; else sum+=graph[romanNum[i+1]]-2*graph[romanNum[i]]; } return sum; }學(xué)到的新的做法就是將字母變成數(shù)組的序號(hào)進(jìn)行賦值,每個(gè)字母代表不同的值。然后將羅馬數(shù)字拆分成一個(gè)個(gè)字符找到每個(gè)字符對(duì)應(yīng)的數(shù)字,再根據(jù)相應(yīng)的法則進(jìn)行加減,最終得出正確結(jié)果,這個(gè)算法的運(yùn)行速度還算不錯(cuò)。
看了一下其他的算法,有的是不對(duì)的,有的視根據(jù)羅馬數(shù)字的構(gòu)造法則分出了很多特殊情況。
有一種很簡單也很用以理解的方法就是:
public int romanToInt(String s) { int nums[]=new int[s.length()]; for(int i=0;i<s.length();i++){ switch (s.charAt(i)){ case 'M': nums[i]=1000; break; case 'D': nums[i]=500; break; case 'C': nums[i]=100; break; case 'L': nums[i]=50; break; case 'X' : nums[i]=10; break; case 'V': nums[i]=5; break; case 'I': nums[i]=1; break; } } int sum=0; for(int i=0;i<nums.length-1;i++){ if(nums[i]<nums[i+1]) sum-=nums[i]; else sum+=nums[i]; } return sum+nums[nums.length-1]; }思路就是先創(chuàng)建與字符串長度相同的整數(shù)數(shù)組,根據(jù)相應(yīng)位置的字母設(shè)置相應(yīng)位置的整數(shù)值。比較對(duì)應(yīng)位置的整數(shù)值后其后一個(gè)位置的整數(shù)值,如果是大于等于的關(guān)系就加上這個(gè)位置的數(shù),否則減去這個(gè)位置的數(shù)字,最后加上最后一位的數(shù)字。
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注