數值轉大寫

兩年前有陣子上Leetcode試玩了一下。 其中有一題Integer to Roman

沒想到兩年多了還是維持在最快(3ms, 再快真的不容易)


程式碼如下:
  1. class Solution {
  2. public String intToRoman(int num) {
  3. int[] nums = new int[]{1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4};
  4. String[] rns = new String[]{"M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV"};
  5. StringBuilder sb = new StringBuilder();
  6. int pos = 0;
  7. while (num > 3 && pos < rns.length) {
  8. int d = num / nums[pos];
  9. int r = num % nums[pos];
  10. if (d > 0) {
  11. for (int i = 0; i < d; i++) {
  12. sb.append(rns[pos]);
  13. }
  14. } else {
  15. pos++;
  16. }
  17. num = r;
  18. }
  19. while (num-- > 0) {
  20. sb.append('I');
  21. }
  22. return sb.toString();
  23.  
  24. }
  25. }

不過這對於我們用中文的來說,比較實用的還是轉國字大寫

import java.util.regex.Pattern;
/**
* @author Kent Yeh
*/
public class ZhBigNum {
public static final Pattern ZEROP = Pattern.compile("\\x{96F6}{2,}");
public static void main(String[] args) {
System.out.println(toZhBigNum("1002000304050"));
System.out.println(toZhBigNum("305000"));
System.out.println(toZhBigNum("100020003000"));
}
public static String toZhBigNum(String value) {
char[] bd = new char[]{'零', '壹', '貳', '參', '肆', '伍', '陸', '柒', '捌', '玖'};
String[] tail1 = new String[]{"", "拾", "佰", "仟"};
String[] tail2 = new String[]{"", "萬", "億", "兆"};
StringBuilder res = new StringBuilder();
int pos = 0;
boolean fnz = false;//每4個一組,直到碰到不是0才為true
for (char c : new StringBuilder(value).reverse().toString().toCharArray()) {
int d = c;
int r = pos / 4;
int m = pos % 4;
boolean nz = c > 48;
fnz = m == 0 ? c > 48 : c > 48 || fnz;
res.append(nz ? tail2[r] : "").append(nz ? tail1[m] : "").append(fnz ? bd[d - 48] : "");
if (nz) {
tail2[r] = "";
}
pos++;
}
return ZEROP.matcher(res.reverse().toString()).replaceAll("零");
}
public static String toZhBigNumFast(String value) {
char[] bd = new char[]{'零', '壹', '貳', '參', '肆', '伍', '陸', '柒', '捌', '玖'};
String[] tail1 = new String[]{"", "拾", "佰", "仟"};
String[] tail2 = new String[]{"", "萬", "億", "兆"};
StringBuilder res = new StringBuilder();
boolean fnz = false;//每4個一組,直到碰到不是0才為true
char[] cs = value.toCharArray();
int len = cs.length;
for (int i = len - 1; i > -1; i--) {
int d = cs[i];
int pos = len - i - 1;
int r = pos / 4;
int m = pos % 4;
boolean nz = d > 48;
fnz = m == 0 ? d > 48 : d > 48 || fnz;
res.append(nz ? tail2[r] : "").append(nz ? tail1[m] : "").append(fnz ? bd[d - 48] : "");
if (nz) {
tail2[r] = "";
}
}
return ZEROP.matcher(res.reverse().toString()).replaceAll("零");
}
}
view raw ZhBigNum.java hosted with ❤ by GitHub
function reverseString(str) {
return str.split('').reverse().join('');
}
function toZhBigNum(snum){
if(!snum||snum===0||snum==='零')
return '零';
snum = ''+snum;
let bd = ['零', '壹', '貳', '參', '肆', '伍', '陸', '柒', '捌', '玖'];
let tail1=['', '拾', '佰', '仟'];
let tail2=['', '萬', '億', '兆'];
let fnz = false;
let len = snum.length;
let res = '';
for (let i = len - 1; i > -1; i--) {
let d = snum.charCodeAt(i);
let pos = len - i - 1;
let r = Math.floor(pos / 4);
let m = pos % 4;
let nz = d > 48;
fnz = m == 0 ? d > 48 : d > 48 || fnz;
if(nz)
res = res + tail2[r] + tail1[m];
if(fnz){
res = res + bd[d - 48];
}
if(nz)
tail2[r] = '';
}
return reverseString(res).replace(/\u96F6{2,}/g, '零');
}
view raw ZhBigNum.js hosted with ❤ by GitHub

留言

這個網誌中的熱門文章

企業人員的統一管理-FreeIPA學習筆記

證交所最佳五檔的程式解析

Postgresql HA