Integer and Roman Numeral | N00tc0d3r


Integer and Roman Numeral | N00tc0d3r
Given an integer, convert it to a roman numeral.
Input is guaranteed to be within the range from 1 to 3999.
Here is the wiki to introduce roman numeral symbols and their corresponding values.
Basic symbols are M, D, C, L, X, V, and I, representing 1000, 500, 100, 50, 10, 5 and 1.
But there are several special rules for 900, 400, 90, 40, 9 and 4 (see wiki for details).
https://leetcode.com/discuss/49870/my-java-solution-easy-to-understand
int[] values = {1000,900,500,400,100,90,50,40,10,9,5,4,1};
String[] strs = {"M","CM","D","CD","C","XC","L","XL","X","IX","V","IV","I"};

StringBuilder sb = new StringBuilder();

for(int i=0;i<values.length;i++) {
    while(num >= values[i]) {
        num -= values[i];
        sb.append(strs[i]);
    }
}
return sb.toString();
}
https://leetcode.com/discuss/62819/easy-to-understand-java-solution
public enum Type{ M(1000),CM(900),D(500),CD(400),C(100),XC(90),L(50),XL(40),X(10),IX(9),V(5),IV(4),I(1); private final int value; Type(int value) { this.value = value; } }; public String intToRoman(int num) { StringBuilder output = new StringBuilder(); for (Type t:Type.values()) { while (num>=t.value) { output.append(t); num -= t.value; } } return output.toString(); }

  public String intToRoman(int num) {
    int[] nums = {1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1};
    String[] symbols = {"M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"};
    StringBuilder res = new StringBuilder();
    int i=0;
    while (num>0) {
      int times = num / nums[i];
      num -= nums[i]*times;
      for (; times>0; times--) {
        res.append(symbols[i]);
      }
      ++i;
    }
    return res.toString();
  }
Roman to Integer
Given a roman numeral, convert it to an integer.
Input is guaranteed to be within the range from 1 to 3999.
Solution

This is the reverse problem of the above one. And we need to consider the special cases when mapping roman numerals back to integer. So, in those cases, we need to check the successor char.
I:
/* int:  1000,  900, 500, 400,  100,  90,  50,   40,   10,   9,   5,    4,   1
 * roman: "M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"
 */
 public int romanToInt(String s) {
   HashMap<Character, Integer> map = new HashMap<Character, Integer>();
   map.put('M', 1000);
   map.put('D', 500);
   map.put('C', 100);
   map.put('L', 50);
   map.put('X', 10);
   map.put('V', 5);
   map.put('I', 1);
 
   int res = 0, i = 0;
   while (i<s.length()) {
     switch(s.charAt(i)) {
     case 'C':
     case 'X':
     case 'I':
       if (i+1 < s.length()
           && map.get(s.charAt(i+1)) > map.get(s.charAt(i))) {
         res += (map.get(s.charAt(i+1)) - map.get(s.charAt(i)));
         i += 2;
       } else {
         res += map.get(s.charAt(i));
         ++i;
       }
       break;
     default:
       res += map.get(s.charAt(i));
       ++i;
     }
   }
   return res;
 }
II:
Or without using switch
 /* int: 1000, 900, 500, 400, 100, 90, 50,  40,  10,  9,  5,  4,  1
  * roman: "M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"
  */
 public int romanToInt(String s) {
   HashMap<Character, Integer> map = new HashMap<Character, Integer>();
   map.put('M', 1000);
   map.put('D', 500);
   map.put('C', 100);
   map.put('L', 50);
   map.put('X', 10);
   map.put('V', 5);
   map.put('I', 1);
 
   int res = 0;
   for (int i=0; i<s.length(); ++i) {
     char c = s.charAt(i);
     if ((c == 'C' || c == 'X' || c == 'I')
         && i+1 < s.length() && map.get(s.charAt(i+1)) > map.get(c)) {
       res += map.get(s.charAt(i+1)) - map.get(c);
       ++i;
     } else {
       res += map.get(c);
     }
   }
   return res;
 }
https://stupidcodergoodluck.wordpress.com/2014/03/31/leetcode-integer-to-roman/
其实就是那么几个符号,然后规律就是1,4,5,9,10然后每次十倍循环。算法就是给一个数,大于1000的时候就写上一个M, 还大于1000,再写一个M… 终于小于1000了,看看大于900不?,大于500不…如此类推。
        String[] symbols = {"M","CM","D","CD","C","XC","L","XL","X","IX","V","IV","I"};
        int[] values = {1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1};
        StringBuilder ret = new StringBuilder();
        for (int i=0; i<values.length; i++) {
            while (num >= values[i]) {
                ret.append(symbols[i]);
                num -= values[i];
            }
        }
        return new String(ret);
    }
http://www.acmerblog.com/leetcode-solution-integer-to-roman-6231.html
Recursive Version:
02    public String intToRoman(int num) {
03        if(num>=1000return "M"+intToRoman(num-1000);
04        if(num>=900return "CM"+intToRoman(num-900);
05        if(num>=500return "D"+intToRoman(num-500);
06        if(num>=400return "CD"+intToRoman(num-400);
07        if(num>=100return "C"+intToRoman(num-100);
08        if(num>=90return "XC"+intToRoman(num-90);
09        if(num>=50return "L"+intToRoman(num-50);
10        if(num>=40return "XL"+intToRoman(num-40);
11        if(num>=10return "X"+intToRoman(num-10);
12        if(num>=9return "IX"+intToRoman(num-9);
13        if(num>=5return "V"+intToRoman(num-5);
14        if(num>=4return "IV"+intToRoman(num-4);
15        if(num>=1return "I"+intToRoman(num-1);
16        return "";
17    }
X.
05    string intToRoman(int num) {
06        const int radix[] = {1000, 900, 500, 400, 100, 90,
07                50, 40, 10, 9, 5, 4, 1};
08        const string symbol[] = {"M""CM""D""CD""C""XC",
09                "L""XL""X""IX""V""IV""I"};
10
11        string roman;
12        for (size_t i = 0; num > 0; ++i) {
13            int count = num / radix[i];
14            num %= radix[i];
15            for (; count > 0; --count) roman += symbol[i];
16        }
17        return roman;
18    }
http://codesam.blogspot.com/2011/06/convert-integers-to-roman-numbers.html
string int2RomanNum(int intVal)
{
   if (intVal <= 0)
   {
      cout << "Roman numbers don't support 0 or negative! Return NULL" << endl;
      return ""; 
   }

   //build hash table of unique values 
   map valueMap;

   valueMap[1] = "I";
   valueMap[4] = "IV";
   valueMap[5] = "V";
   valueMap[9] = "IX";
   valueMap[10] = "X";
   valueMap[40] = "XL";
   valueMap[50] = "L";
   valueMap[90] = "XC";
   valueMap[100] = "C";
   valueMap[400] = "CD";
   valueMap[500] = "D";
   valueMap[900] = "CM";
   valueMap[1000] = "M";

   //the roman value
   string romanResult = "";

   //traverse the list in reverse order 
   map::reverse_iterator it;
   
   for (it = valueMap.rbegin(); it != valueMap.rend(); it++)
   {
      //if current number is greater than current key in list
      //add the value corresponded with key to result
      //then subtract the equivalent int value from current number
      while (intVal >= it->first)
      {
         romanResult = romanResult + it->second;
         intVal = intVal - it->first;
      }
   }

   return romanResult;
}

http://blog.csdn.net/havenoidea/article/details/11848921
Read full article from Integer and Roman Numeral | N00tc0d3r

Labels

LeetCode (1432) GeeksforGeeks (1122) LeetCode - Review (1067) Review (882) Algorithm (668) to-do (609) Classic Algorithm (270) Google Interview (237) Classic Interview (222) Dynamic Programming (220) DP (186) Bit Algorithms (145) POJ (141) Math (137) Tree (132) LeetCode - Phone (129) EPI (122) Cracking Coding Interview (119) DFS (115) Difficult Algorithm (115) Lintcode (115) Different Solutions (110) Smart Algorithm (104) Binary Search (96) BFS (91) HackerRank (90) Binary Tree (86) Hard (79) Two Pointers (78) Stack (76) Company-Facebook (75) BST (72) Graph Algorithm (72) Time Complexity (69) Greedy Algorithm (68) Interval (63) Company - Google (62) Geometry Algorithm (61) Interview Corner (61) LeetCode - Extended (61) Union-Find (60) Trie (58) Advanced Data Structure (56) List (56) Priority Queue (53) Codility (52) ComProGuide (50) LeetCode Hard (50) Matrix (50) Bisection (48) Segment Tree (48) Sliding Window (48) USACO (46) Space Optimization (45) Company-Airbnb (41) Greedy (41) Mathematical Algorithm (41) Tree - Post-Order (41) ACM-ICPC (40) Algorithm Interview (40) Data Structure Design (40) Graph (40) Backtracking (39) Data Structure (39) Jobdu (39) Random (39) Codeforces (38) Knapsack (38) LeetCode - DP (38) Recursive Algorithm (38) String Algorithm (38) TopCoder (38) Sort (37) Introduction to Algorithms (36) Pre-Sort (36) Beauty of Programming (35) Must Known (34) Binary Search Tree (33) Follow Up (33) prismoskills (33) Palindrome (32) Permutation (31) Array (30) Google Code Jam (30) HDU (30) Array O(N) (29) Logic Thinking (29) Monotonic Stack (29) Puzzles (29) Code - Detail (27) Company-Zenefits (27) Microsoft 100 - July (27) Queue (27) Binary Indexed Trees (26) TreeMap (26) to-do-must (26) 1point3acres (25) GeeksQuiz (25) Merge Sort (25) Reverse Thinking (25) hihocoder (25) Company - LinkedIn (24) Hash (24) High Frequency (24) Summary (24) Divide and Conquer (23) Proof (23) Game Theory (22) Topological Sort (22) Lintcode - Review (21) Tree - Modification (21) Algorithm Game (20) CareerCup (20) Company - Twitter (20) DFS + Review (20) DP - Relation (20) Brain Teaser (19) DP - Tree (19) Left and Right Array (19) O(N) (19) Sweep Line (19) UVA (19) DP - Bit Masking (18) LeetCode - Thinking (18) KMP (17) LeetCode - TODO (17) Probabilities (17) Simulation (17) String Search (17) Codercareer (16) Company-Uber (16) Iterator (16) Number (16) O(1) Space (16) Shortest Path (16) itint5 (16) DFS+Cache (15) Dijkstra (15) Euclidean GCD (15) Heap (15) LeetCode - Hard (15) Majority (15) Number Theory (15) Rolling Hash (15) Tree Traversal (15) Brute Force (14) Bucket Sort (14) DP - Knapsack (14) DP - Probability (14) Difficult (14) Fast Power Algorithm (14) Pattern (14) Prefix Sum (14) TreeSet (14) Algorithm Videos (13) Amazon Interview (13) Basic Algorithm (13) Codechef (13) Combination (13) Computational Geometry (13) DP - Digit (13) LCA (13) LeetCode - DFS (13) Linked List (13) Long Increasing Sequence(LIS) (13) Math-Divisible (13) Reservoir Sampling (13) mitbbs (13) Algorithm - How To (12) Company - Microsoft (12) DP - Interval (12) DP - Multiple Relation (12) DP - Relation Optimization (12) LeetCode - Classic (12) Level Order Traversal (12) Prime (12) Pruning (12) Reconstruct Tree (12) Thinking (12) X Sum (12) AOJ (11) Bit Mask (11) Company-Snapchat (11) DP - Space Optimization (11) Dequeue (11) Graph DFS (11) MinMax (11) Miscs (11) Princeton (11) Quick Sort (11) Stack - Tree (11) 尺取法 (11) 挑战程序设计竞赛 (11) Coin Change (10) DFS+Backtracking (10) Facebook Hacker Cup (10) Fast Slow Pointers (10) HackerRank Easy (10) Interval Tree (10) Limited Range (10) Matrix - Traverse (10) Monotone Queue (10) SPOJ (10) Starting Point (10) States (10) Stock (10) Theory (10) Tutorialhorizon (10) Kadane - Extended (9) Mathblog (9) Max-Min Flow (9) Maze (9) Median (9) O(32N) (9) Quick Select (9) Stack Overflow (9) System Design (9) Tree - Conversion (9) Use XOR (9) Book Notes (8) Company-Amazon (8) DFS+BFS (8) DP - States (8) Expression (8) Longest Common Subsequence(LCS) (8) One Pass (8) Quadtrees (8) Traversal Once (8) Trie - Suffix (8) 穷竭搜索 (8) Algorithm Problem List (7) All Sub (7) Catalan Number (7) Cycle (7) DP - Cases (7) Facebook Interview (7) Fibonacci Numbers (7) Flood fill (7) Game Nim (7) Graph BFS (7) HackerRank Difficult (7) Hackerearth (7) Inversion (7) Kadane’s Algorithm (7) Manacher (7) Morris Traversal (7) Multiple Data Structures (7) Normalized Key (7) O(XN) (7) Radix Sort (7) Recursion (7) Sampling (7) Suffix Array (7) Tech-Queries (7) Tree - Serialization (7) Tree DP (7) Trie - Bit (7) 蓝桥杯 (7) Algorithm - Brain Teaser (6) BFS - Priority Queue (6) BFS - Unusual (6) Classic Data Structure Impl (6) DP - 2D (6) DP - Monotone Queue (6) DP - Unusual (6) DP-Space Optimization (6) Dutch Flag (6) How To (6) Interviewstreet (6) Knapsack - MultiplePack (6) Local MinMax (6) MST (6) Minimum Spanning Tree (6) Number - Reach (6) Parentheses (6) Pre-Sum (6) Probability (6) Programming Pearls (6) Rabin-Karp (6) Reverse (6) Scan from right (6) Schedule (6) Stream (6) Subset Sum (6) TSP (6) Xpost (6) n00tc0d3r (6) reddit (6) AI (5) Abbreviation (5) Anagram (5) Art Of Programming-July (5) Assumption (5) Bellman Ford (5) Big Data (5) Code - Solid (5) Code Kata (5) Codility-lessons (5) Coding (5) Company - WMware (5) Convex Hull (5) Crazyforcode (5) DFS - Multiple (5) DFS+DP (5) DP - Multi-Dimension (5) DP-Multiple Relation (5) Eulerian Cycle (5) Graph - Unusual (5) Graph Cycle (5) Hash Strategy (5) Immutability (5) Java (5) LogN (5) Manhattan Distance (5) Matrix Chain Multiplication (5) N Queens (5) Pre-Sort: Index (5) Quick Partition (5) Quora (5) Randomized Algorithms (5) Resources (5) Robot (5) SPFA(Shortest Path Faster Algorithm) (5) Shuffle (5) Sieve of Eratosthenes (5) Strongly Connected Components (5) Subarray Sum (5) Sudoku (5) Suffix Tree (5) Swap (5) Threaded (5) Tree - Creation (5) Warshall Floyd (5) Word Search (5) jiuzhang (5)

Popular Posts