| |

做題筆記:Roman to Integer (Java)

題目描述:

將羅馬數字轉換為整數,具體規則略。

Example 1:

Input: s = "III"
Output: 3
Explanation: III = 3.

Example 2:

Input: s = "LVIII"
Output: 58
Explanation: L = 50, V= 5, III = 3.

Example 3:

Input: s = "MCMXCIV"
Output: 1994
Explanation: M = 1000, CM = 900, XC = 90 and IV = 4.

自己的 Switch 暴力解法:

兜了好幾個圈……

class Solution {
    public int romanToInt(String s) {
        int num = 0;
        StringBuilder re = new StringBuilder();
        re.append(s).reverse();
        String[] split = re.toString().split("(?<=\\G..)");
        for (String i:split){
            switch(i){
                case "VI":
                    num = num + 4;
                    break;
                case "XI":
                    num = num + 9;
                    break;
                case "LX":
                    num = num + 40; 
                    break;
                case "CX":
                    num = num + 90; 
                    break;
                case "DC":
                    num = num + 400;
                    break;
                case "MC":
                    num = num + 900; 
                    break;
                default:
                    String[] sub = i.split("");
                    for (String j:sub){
                        switch(j){
                            case "I":
                                num = num + 1;
                                break;
                            case "V":
                                num = num + 5;
                                break;
                            case "X":
                                num = num + 10; 
                                break;
                            case "L":
                                num = num + 50; 
                                break;
                            case "C":
                                num = num + 100;
                                break;
                            case "D":
                                num = num + 500; 
                                break;
                            case "M":
                                num = num + 1000;     
                                break;
                        }
                    }
                }
        }
        return num;    
    }
}

意外發生了,本地 IDE 能跑出正確答案,但是在 Leetcode 上跑不出來,我竟然為這種問題浪費了不少時間,最終也沒解決……

正確精練的 Switch 解法:

class Solution {
	 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];
	}
}

6 ms

運用 Hashmap:

class solution {
    public int romanToInt(String s) {
        Map map = new HashMap<>();
        map.put('I',1);
        map.put('V',5);
        map.put('X',10);
        map.put('L',50);
        map.put('C',100);
        map.put('D',500);
        map.put('M',1000);
        
        int result = map.get(s.charAt(s.length()-1));
        for(int i=s.length()-2; i>=0; i--){
            if(map.get(s.charAt(i)) < map.get(s.charAt(i+1))){
                result -= map.get(s.charAt(i));
            }
            else{
                result += map.get(s.charAt(i));
            }
        }
        return result;
    }
}

Similar Posts

  • |

    《重慶破曉》樣章

    PDF下載(初版) 本版本為初版,未經校对,存在筆誤,僅供試讀。 請在 Amazon 上購買支持最新修訂版。 Dawn Over Chungking 此書獻給 Chen San,Huan-Erh和Taiyün。 Contents 譯者序. 4 出版社前言. 6 1.歸家的決定. 7 2.日本. 9 3.香港. 10 4.香港. 12 5.飛向重慶. 13 6.雨中漫步. 15 7.北碚巴士之旅. 20 8.北碚的第一天. 21 9.鎮上. 23 10.傅嫂. 24 11.北碚生活. 25 12.首次轟炸. 26 13.首次轟炸. 29 14.鎮上. 31 15.煉乳和咖啡. 35 16.唐老闆. 36 17.柑子灣. 37 18.柑子灣. 40 19.防空洞生活. 45 20.嘉陵江….

  • | |

    幣卡實踐

    加拿大身分可 KYC 的幣卡不多,基本就只有《加國即享羊毛🐏》提到的 Crypto.com Visa 那唯一一張,Shakepay 和 Wealthsimple 勉強也算,畢竟可以透過加密貨幣出金,但上述三者都是預付存錢模式,沒有真正做到直接消費加密貨幣。 本文介紹的幣卡需以中國或其他支援國家的身分進行 KYC。 Bybit Card 目前新用戶註冊開通後,30 天內充值至少 100U 等值金額,可獲得 10% 返現回饋。 用中國 KYC 過 Lv1 之後,發卡地選蒙古、不丹、哈薩克斯坦、吉爾吉斯斯坦、塔吉克斯坦,無需任何地址驗證材料,僅需填寫當地住址即可,目前無審核,虛擬卡秒過。不需要提高 KYC 等級。 Bitget Wallet Card Bitget Wallet Card 於 2025 年 11 月 20 日正式開放「0 手續費」功能。普通用戶每月享有 400U 額度免手續費。 Bitget Wallet 為 Web3 錢包,無需註冊。 請直接透過連結申請卡片或使用邀請碼:wSnV9L。 中國用戶開通時注意選擇 Fiat24 提供的卡,海外用戶可選擇 VISA 卡。

  • |

    威妥瑪拼音淺探

    香港 XMA 的 AAP 上,給一位歐洲友軍遞上我的 Biocard 時發生了一件小故事。我的卡上第一句寫有 Macau/Chungking 的字樣,Macau 自然知名度高也緊鄰香港,大家都知道是哪,沒人提出過疑惑,不過他皺了皺眉,問我 Chungking 是 Chungking Mansions 嗎? 一時不知道怎麼回答,就告訴他寫成漢字是一個東西,Chungking Mansions 雖然和重慶城市沒什麼關係,但是借用了他這個地名,和XX路一個道理……看他還是似懂非懂,索性把 Chongqing 維基詞條的第一句話給他展示了:「Chongqing, formerly romanized as Chungking. 」(說起來在更深的交流中他完全不理解詞條中 municipality 指代的是直轄市這個意思,考證一下直轄市最早是誰翻譯成 municipality 也許挺有意思的2333 Formerly romanized,曾經的一套羅馬拼音方案,即是今天我想講的威妥瑪拼音。當時聊天時沒想到從拼音方案這個角度去解釋,不過憑我的三腳貓英語功夫,怕是會越講越複雜。以前僅僅知道威妥瑪這套方案,沒有細究,強行硬套在 Biocard 上面,真正被問及時反而尷尬了。 威妥瑪拼音下的重慶更準確地說應該拼為 Chung-chʻing,當年由於發電報時的一些限制,簡化掉了附加符號和音調號,最後而成的「Chungking」嚴格上稱之為郵政式拼音。郵政式拼音有許多調整,除了上面講到的簡化一些符號外,還包括一些其他規則。比如應用在 Chungking 這個詞上一條規則,視尖團音的差別,將 Chi、ch’i、hsi 以 tsi、tsi、si 或 ki、ki、hi 表示。 聯合國於1977年起正式改用漢語拼音拼寫中國大陸地名,但即使如此一些歷史上極具影響力的名詞還是保留到了今天,在 IATA 代碼中,重慶江北國際機場用 CKG 表示,顯然是沿用了 Chungking,同理還有首都機場 PEK 沿用 Peking 等等。又如清華大學(Tsinghua University),過去的一些中文名詞音譯如功夫(Kungfu),太極(Taichi)等等例子,處處還存留著威妥瑪的影子。 雖然大陸已經變更了方案很多年,但臺灣基本上保留了威妥瑪拼音方案的譯名,如臺北(Taipei),高雄(Kaohsiung),臺中(Taichung)皆是官方沿用至今,臺灣的許多人名也是以威妥瑪為標準,比如蔡英文(Tsai Ing-wen),不過臺灣近年來的政策也慢慢開始往漢語拼音靠攏了。另外港澳這邊的譯名有些許差異,威妥瑪拼音本質上是拼寫官話的拼音系統,例如廣州作…

  • | |

    LBS 遊戲,沉寂或繁榮

    LBS (Location Based Service)遊戲,即基於真實地理位置的遊戲,在一場大瘟疫面前,突然顯得十分脆弱。我之前一直談及的 Ingress 便是其一,不過現在已經鴿了 Ingress 系列,過往零零散散有不少碎片信息,放一起整合一下也未必不可。 想談 LBS 的真正契機是前幾天微軟宣布旗下的 Minecraft Earth 將於 2021 年 6 月 30 日正式停止運營,而這款遊戲不過上線了一年之餘。百業蕭條的這一年,電子遊戲界持續的繁榮讓其他業者垂涎不已,殊不知其中也有 LBS 遊戲這樣的天涯淪落人。這也恰恰彰顯了 LBS 遊戲的本質——它們與「傳統電子遊戲」有很大的區別。 「傳統電子遊戲」一詞出自我一個朋友嘴中,是那種成日追大作首發,也不乏挖掘冷門,還會往遊戲媒體投稿的硬核玩家。可我向他安利了好多次 Ingress 都無果,我猜這個宅男其實就是不想出門,當然他給我的檯面上的理由是:「我還是想玩玩傳統的電子遊戲」。 既然它們不傳統,真正「前衛」的地方就是,你得出門啊!坐享著全套室內服務,好幾個月能不出門的現代小年輕一聽,這還得了。所以 LBS 遊戲並沒有那麼受「慵懶的」年輕人的歡迎,即使是在瘟疫爆發之前,曇花一現的 LBS 作品也出現過不少,我記得的就有 Empower Labs 出品的 Delta T。瘟疫只是壓死 Minecraft Earth 的最後一根稻草罷了,絕非根本原因。 Minecraft Earth 的可惜之處在於,這個 IP 實在是太值錢太有名了,龐大的玩家基數,讓圈內人曾經對它寄予厚望。雖然剛才講的全是 LBS 遊戲的窘境,但也不乏有超級成功的例子——Niantic 的 Pokémon GO。甚至可以稱之為家喻戶曉的程度,外行人未必知道你那 L 啥 B 啥 S…

  • |

    過客之年

    你站在橋上看風景,看風景的人在樓上看你。 明月裝飾了你的窗子,你裝飾了別人的夢。 2025 年,幾件大事,脈絡十分清晰,稱不上渾渾噩噩,但就是莫名過得很快。讓我久違地想認真寫一篇年終總結。 甚至年底時刷到大V推友說,還能寫年終總結的人,沒有到能影響股價的地步。很在理,我可影響不了什麼股價,只是記我的流水帳。 我沒有年度漢字,但如果要挑一個年度詞,大概是「過客」。 你對城市是過客,事業對你是過客,那個人對你亦是過客。 年初還循著舊習慣在過日子,頭兩個月都是在到處瞎逛,我太浮躁了,一定要高強度輸入刺激才能過活,閾值也越來越高。 縱觀整年的人際交往,發現真正的寶藏人脈是在二月 IFS 上認識的,而不是年中那些無效社交,所以還是 Ingress 更靠譜嗎?我之後還發現了一個特別有趣的細節,最開始熱聊了幾天,接著從二月底到四月底斷聯了整整兩個月,才重新聯絡上。(直覺裡總覺得應該是在頻繁交流)。優質關係感覺確實需要沉澱一番。而那種一上來熱情無比,天天都在聊天的上頭關係,無法持續。 再進一步概括,上述所說不就是「君子之交淡若水,小人之交甘若醴」嗎?又落後先哲兩千年。 二月中逃離加拿大的冬天,去 Tucson 打 2025 年的第一場大戰,首次沒有在加勒比過冬,而是感受 Arizona 的沙漠陽光。 接到人生第一次裁員的消息,不過是從鳳凰城回來後的第二週,這大概就叫心情大起大落。此時才意識到,Job Security 確實是一個很重要的概念,否則你不過是職場的過客。但其實當時對這件事沒太所謂,本來也沒多喜歡那份工作,況且能拿到 EI,這類福利才是作為發達國家能為你兜底的生存線。那就先休息一陣子吧,去做朝九晚五時做不了的那些事。 於是,我趁著第一次有這麼長的閒暇時間,不用上班,不用上學,決定回國探親一趟,這是我三年間第一次回國。走的那天,剛好出大選結果。PP 竟然從領先二十個點被極限翻盤,全拜南邊鄰居那位所賜,如今回想起來,2025 會是極其 Drama 的一年,早有所預示。 在國內,先去深圳看了姐姐剛生的孩子,我的侄女。始終感覺別人的人生劇本還是按最常見的模式在推進,每次我提到我是不婚主義,別人都只當我是打嘴炮,譏諷我一定有一天會結。為什麼一定呢?今年種種經歷都是在告訴我,人生太不定了。 後來陪父母去了一趟西藏,其實心裡打的算盤是,成為外國人以後無法再去西藏自由行了,抓緊時間去一趟。拉薩往返阿里,俗稱小環線。 三年沒回國,香港則是瘟疫爆發後再也沒去過,也就是說,我從沒踏上過實行國安法後的「美麗新香港」。此番在美麗新香港,港鐵徵收了我五年不常用八達通行政費,45 港紙。路邊的橫幅更是哭笑不得,已經整整五年了嗎? 今年的六四集會都是那麼荒誕,去年發生過一些事情,造成了老民運和較新一派各自舉辦紀念活動。事發時我有所銳評,不在此多做贅述。 接下來的主旋律就是以找工作為主吧,輔以一些小插曲,比如去考了槍牌、又多翻譯了兩本書甚至發現中文榜單非常好打榜。畢竟誰沒事在加區買中文書呀。還有很難能可貴的一件事是,雖然每天很焦慮投簡歷,整個下午,能把每日新增的崗位投完,但其實之後也就不知道該再做什麼好,於是我今年竟然有時間玩遊戲了!要知道我前兩年的 Steam 年終總結,基本都是空的。況且我的頭號玩家好朋友,只要一出大作就馬上買,我在 Steam 家庭裡待著,玩遊戲從來沒付過錢。他真的是我家人啊,這不是家人是什麼?我今年為此還自建了一個遊戲評測站。 如此差的市場環境下,我也親身體驗了什麼叫做就業地獄。愣是幾個月,幾千份申請,杳無音訊。那段時間我也高強度地參加一些社交活動,主要都是 Web3 的主題,偶爾有一些 AI 或者傳統 Tech 相關的,幻想著能巧遇什麼工作機會。事實證明,這類活動都是無效社交居多。工作沒找到,期間倒是有一段終成過客的 Situationship,在另一篇文章裡說了很多,不願再提。 真正再次工作,已經是九月了,並不是一份加拿大的工作,本地的失業率就是地獄級,想找份餐館工都沒機會。並且還遭遇了一些非常不好的事情,即西人公司也開始搞試工那一套,還打算不付工資,Service Canada 幫我打了個電話過去他們立即認慫。 在那之後投了某 base 新加坡的 Top…

  • |

    加拿大自出版 ISBN 攻略

    我又帶來乾貨了,全網首發,本文發表之前沒有相關中文資訊。估計真正會接觸到自出版領域的人還是比較少。 ISBN 大家不會陌生,即國際標準書號,每本書後面都有。最近給自己 KDP 上已出版的四本書都申請了書號,過程相當順利,直觀體驗了出版自由該是什麼模樣。本攻略重點將放在自出版上,尤其是電子書。 加拿大的 ISBN 是由 Library and Archives Canada (LAC) 管理,免費提供,當然 ISBN 在各國 technically 都該是免費的,包括中國。但實際上,加拿大可能是全世界最慷慨的國家,沒有之一。很多國家名義免費,但政府仍會收一筆較低的行政費用。至於中國,跟出版社打過交道就知道,中國的 ISBN 壟斷在大型機構手上,進行出版有大量審查不說,你如果想透過它們自費出版價格極高,幾乎不可能像在加拿大這樣絲滑自出版一本書。另外美國雖然出版也自由,但 ISBN 由一家叫 Bowker 的私營公司壟斷管理,需要付費,甚至是明碼標價 $125 一個,從這個角度看,加拿大的 ISBN 又何嘗不算一種福利? 首先要前往加拿大 ISBN 政府官網申請帳號,下圖所示的 Publisher information,作為 self-publisher 全部填上自己本人的信息即可,自己的名字即是 Publisher Name,地址同樣填自家住址。職位一欄就作者(Author)、譯者(Translator)之類的即可。不過這樣做你自己的信息就完全進入了政府出版社索引之中,幾乎實名上網,所以英文紅迪上就有人願意以簡單註冊一家公司的方式來規避這個問題。 表單提交後開始等待政府審核,最長 30 個工作日(2026 年 10 月更新:官方現在標示申請積壓,新帳號審核約需兩個月),我就等了一個月以上。期間有可能會觸發人工核驗,ISBN 會發郵件詢問你一些相關問題,以確認你是否真的是合資格的(自)出版商,避免 ISBN 系統遭到濫用。所以你最好已經有一個可供展示的出版結果,像我這樣出版在 KDP 就是其中一個選擇,出版結果在最後一步法定送存中也是必須的,稍後會講到。 我就收到了人工核驗的郵件,基本都是表單問過的問題,但他們想 double check,包括地址一類的證明還需要傳張銀行帳單過去,其實就是一個 KYC 的過程。另外會詢問你的出版物涉及的具體領域,這是原表單沒有的。最後,還需提供一份剛剛提到的出版物樣本以確認出版資質,KDP 即可。 審核通過後,ISBN…

Leave a Reply

Your email address will not be published. Required fields are marked *