leetcode-java.T013_RomarToInteger 罗马数字转成整数数字
2017-06-05 01:39
507 查看
每天坚持刷leetcode----罗马数字转整数数字:
package leetcode.T013_RomarToInteger;
/**
* @Title: Solution.java
* @Package leetcode.T013_RomarToInteger
* @Description: TODO
* @author zhouzhixiang
* @date 2017-6-4 下午11:58:22
* @version V1.0
*/
public class Solution {
/**
* <pre>
* 原题
* Given a roman numeral, convert it to an integer.
* Input is guaranteed to be within the range from 1 to 3999.
*
* 题目大意
* 给定一个罗马数字,将其转换成对应的整数。
* 输入的数字在1-3999之间。
*
* 解题思路
* 根据罗马数字与整数数字对应关系进行加法操作,如果前一个数字比后一个大就相减,否则进行相加。
* </pre>
*
* @param s
* @return
*/
public static void main(String[] args) {
// int result = Solution.RomarToInteger("CXCIX");
// int result = Solution.RomarToInteger2("CXCIX");
int result = Solution.RomarToInteger3("CXCIX");
System.out.println(result);
}
/**
* <pre>
* 参考:
* 解题思路:
* 根据罗马数字与整数数字对应关系进行加法操作,如果前一个数字比后一个大
* 就相减,小就相加
*
* </pre>
*/
public static int RomarToInteger3(String str){
// I 1
// V 5
// X 10
// L 50
// C 100
// D 500
// M 1000
int result = 0;
int pre = 0;
for(int i=str.length()-1; i>=0; i--){
switch(str.charAt(i)){
case 'I':
if(1<pre){
result -= 1;
}else{
result += 1;
}
pre = 1;
break;
case 'V':
if(5<pre){
result -= 5;
}else{
result += 5;
}
pre = 5;
break;
case 'X':
if(10<pre){
result -= 10;
}else{
result += 10;
}
pre = 10;
break;
case 'L':
if(50<pre){
result -= 50;
}else{
result += 50;
}
pre = 50;
break;
case 'C':
if(100<pre){
result -= 100;
}else{
result += 100;
}
pre = 100;
break;
case 'D':
if(500<pre){
result -= 500;
}else{
result += 500;
}
pre = 500;
break;
case 'M':
if(1000<pre){
result -= 1000;
}else{
result += 1000;
}
pre = 1000;
break;
}
}
return result;
}
// I 1
// V 5
// X 10
// L 50
// C 100
// D 500
// M 1000
/**
* 错误的程序--------------比如199-CXCIX 但是出来的结果是221
* 错误原因:没有考虑到前一个数字比后一个数字大的情况,大就相减,小就相加
* @Title: RomarToInteger
* @Description: TODO
* @param @param s
* @param @return
* @return int
* @throws
*/
public static int RomarToInteger(String s){
// DLII 552
int len = s.length();
int n1 = 0;
int n5 = 0;
int n10 = 0;
int n50 = 0;
int n100 = 0;
int n500 = 0;
int n1000 = 0;
int result = 0;
String[] a = new String[len];
// String[] a = new String[]{"I","V","X","L","C","D","M"};
char[] chars = s.toCharArray();
for(int i=len-1;i>0;i--){
char c = chars[i];
String str = String.valueOf(c);
a[i] = str;
}
for(int i=0; i<len;i++){
if(s.charAt(i)=='I'){
n1++;
}
if(s.charAt(i)=='V'){
n5++;
}
if(s.charAt(i)=='X'){
n10++;
}
if(s.charAt(i)=='L'){
n50++;
}
if(s.charAt(i)=='C'){
n100++;
}
if(s.charAt(i)=='D'){
n500++;
}
if(s.charAt(i)=='M'){
n1000++;
}
}
result = result + 1000*n1000 + 500*n500 + 100*n100 + 50*n50 + 10*n10 + 5*n5 + 1*n1;
return result;
}
// 修改
public static int RomarToInteger2(String s){
// DLII 552
int len = s.length();
int n1 = 0;
int n5 = 0;
int n10 = 0;
int n50 = 0;
int n100 = 0;
int n500 = 0;
int n1000 = 0;
int result = 0;
int pre = 0;
String[] a = new String[len];
// String[] a = new String[]{"I","V","X","L","C","D","M"};
char[] chars = s.toCharArray();
for(int i=len-1;i>0;i--){
char c = chars[i];
String str = String.valueOf(c);
a[i] = str;
}
for(int i=len-1; i>=0;i--){
if(s.charAt(i)=='I'){
if(1<pre){
n1--;
}else{
n1++;
}
pre = 1;
}
if(s.charAt(i)=='V'){
if(5<pre){
n5--;
}else{
n5++;
}
pre = 5;
}
if(s.charAt(i)=='X'){
if(10<pre){
n10--;
}else{
n10++;
}
pre = 10;
}
if(s.charAt(i)=='L'){
if(50<pre){
n50--;
}else{
n50++;
}
pre = 50;
}
if(s.charAt(i)=='C'){
if(100<pre){
n100--;
}else{
n100++;
}
pre = 100;
}
if(s.charAt(i)=='D'){
if(500<pre){
n500--;
}else{
n500++;
}
pre = 500;
}
if(s.charAt(i)=='M'){
if(1000<pre){
n1000--;
}else{
n1000++;
}
pre = 1000;
}
}
result = result + 1000*n1000 + 500*n500 + 100*n100 + 50*n50 + 10*n10 + 5*n5 + 1*n1;
return result;
}
}
package leetcode.T013_RomarToInteger;
/**
* @Title: Solution.java
* @Package leetcode.T013_RomarToInteger
* @Description: TODO
* @author zhouzhixiang
* @date 2017-6-4 下午11:58:22
* @version V1.0
*/
public class Solution {
/**
* <pre>
* 原题
* Given a roman numeral, convert it to an integer.
* Input is guaranteed to be within the range from 1 to 3999.
*
* 题目大意
* 给定一个罗马数字,将其转换成对应的整数。
* 输入的数字在1-3999之间。
*
* 解题思路
* 根据罗马数字与整数数字对应关系进行加法操作,如果前一个数字比后一个大就相减,否则进行相加。
* </pre>
*
* @param s
* @return
*/
public static void main(String[] args) {
// int result = Solution.RomarToInteger("CXCIX");
// int result = Solution.RomarToInteger2("CXCIX");
int result = Solution.RomarToInteger3("CXCIX");
System.out.println(result);
}
/**
* <pre>
* 参考:
* 解题思路:
* 根据罗马数字与整数数字对应关系进行加法操作,如果前一个数字比后一个大
* 就相减,小就相加
*
* </pre>
*/
public static int RomarToInteger3(String str){
// I 1
// V 5
// X 10
// L 50
// C 100
// D 500
// M 1000
int result = 0;
int pre = 0;
for(int i=str.length()-1; i>=0; i--){
switch(str.charAt(i)){
case 'I':
if(1<pre){
result -= 1;
}else{
result += 1;
}
pre = 1;
break;
case 'V':
if(5<pre){
result -= 5;
}else{
result += 5;
}
pre = 5;
break;
case 'X':
if(10<pre){
result -= 10;
}else{
result += 10;
}
pre = 10;
break;
case 'L':
if(50<pre){
result -= 50;
}else{
result += 50;
}
pre = 50;
break;
case 'C':
if(100<pre){
result -= 100;
}else{
result += 100;
}
pre = 100;
break;
case 'D':
if(500<pre){
result -= 500;
}else{
result += 500;
}
pre = 500;
break;
case 'M':
if(1000<pre){
result -= 1000;
}else{
result += 1000;
}
pre = 1000;
break;
}
}
return result;
}
// I 1
// V 5
// X 10
// L 50
// C 100
// D 500
// M 1000
/**
* 错误的程序--------------比如199-CXCIX 但是出来的结果是221
* 错误原因:没有考虑到前一个数字比后一个数字大的情况,大就相减,小就相加
* @Title: RomarToInteger
* @Description: TODO
* @param @param s
* @param @return
* @return int
* @throws
*/
public static int RomarToInteger(String s){
// DLII 552
int len = s.length();
int n1 = 0;
int n5 = 0;
int n10 = 0;
int n50 = 0;
int n100 = 0;
int n500 = 0;
int n1000 = 0;
int result = 0;
String[] a = new String[len];
// String[] a = new String[]{"I","V","X","L","C","D","M"};
char[] chars = s.toCharArray();
for(int i=len-1;i>0;i--){
char c = chars[i];
String str = String.valueOf(c);
a[i] = str;
}
for(int i=0; i<len;i++){
if(s.charAt(i)=='I'){
n1++;
}
if(s.charAt(i)=='V'){
n5++;
}
if(s.charAt(i)=='X'){
n10++;
}
if(s.charAt(i)=='L'){
n50++;
}
if(s.charAt(i)=='C'){
n100++;
}
if(s.charAt(i)=='D'){
n500++;
}
if(s.charAt(i)=='M'){
n1000++;
}
}
result = result + 1000*n1000 + 500*n500 + 100*n100 + 50*n50 + 10*n10 + 5*n5 + 1*n1;
return result;
}
// 修改
public static int RomarToInteger2(String s){
// DLII 552
int len = s.length();
int n1 = 0;
int n5 = 0;
int n10 = 0;
int n50 = 0;
int n100 = 0;
int n500 = 0;
int n1000 = 0;
int result = 0;
int pre = 0;
String[] a = new String[len];
// String[] a = new String[]{"I","V","X","L","C","D","M"};
char[] chars = s.toCharArray();
for(int i=len-1;i>0;i--){
char c = chars[i];
String str = String.valueOf(c);
a[i] = str;
}
for(int i=len-1; i>=0;i--){
if(s.charAt(i)=='I'){
if(1<pre){
n1--;
}else{
n1++;
}
pre = 1;
}
if(s.charAt(i)=='V'){
if(5<pre){
n5--;
}else{
n5++;
}
pre = 5;
}
if(s.charAt(i)=='X'){
if(10<pre){
n10--;
}else{
n10++;
}
pre = 10;
}
if(s.charAt(i)=='L'){
if(50<pre){
n50--;
}else{
n50++;
}
pre = 50;
}
if(s.charAt(i)=='C'){
if(100<pre){
n100--;
}else{
n100++;
}
pre = 100;
}
if(s.charAt(i)=='D'){
if(500<pre){
n500--;
}else{
n500++;
}
pre = 500;
}
if(s.charAt(i)=='M'){
if(1000<pre){
n1000--;
}else{
n1000++;
}
pre = 1000;
}
}
result = result + 1000*n1000 + 500*n500 + 100*n100 + 50*n50 + 10*n10 + 5*n5 + 1*n1;
return result;
}
}
相关文章推荐
- 【LeetCode-面试算法经典-Java实现】【013-Roman to Integer (罗马数字转成整数)】
- [C++]LeetCode 12: Integer to Roman(将整数转换为罗马数字)
- Java - 计蒜客 - 整数转换成罗马数字
- leetcode-java.T001_TwoSum 给定一个整数数组,找出其中两个数满足相加等于你指定的目标数字
- LeetCode--Roman to Integer 罗马数字转化成整数
- LeetCode | Integer to Roman(整数转换成罗马数字)
- leetCode 12.Integer to Roman (整数转罗马数字) 解题思路和方法
- LeetCode 12 Integer to Roman (整数转罗马数字)
- leetcode-12. Integer to Roman(整数转换成罗马数字)
- LeetCode 13. Roman to Integer 罗马数字转整数
- LeetCode习题笔记——罗马数字和整数之间的转换
- leetcode 罗马数字与整数的转换算法
- Java - 计蒜客 - 罗马数字转换成整数
- [Leetcode] Interger to roman 整数转成罗马数字
- [LeetCode] Integer to Roman 整数转化成罗马数字
- 整数转换成罗马数字java实现
- Leet Code 12 Integer to Roman - 整数转成罗马数字 - Java
- leetcode:Integer to Roman(整数转化为罗马数字)
- LeetCode 13. Roman to Integer -- 罗马数字转整数
- [Leetcode] Roman to integer 罗马数字转成整数