回文算法的对于整型数据的一些巧妙的处理

leetcode题目链接:https://leetcode.com/problems/reverse-integer/description/

/**********
Problem:Given a 32-bit signed integer, reverse digits of an integer.
@param tmp 输出值的过度值,
@param ans 输出的结果值,
@param x 输入的数值。
**********/
int
reverse(int x){
int tmp; int ans=0; while(x) {
    //
每次迭代,都获取ans*10倍的数与x需要去掉的个位数的和。
    tmp=ans*10+x%10; 
//int型的数据为4字节数据范围为(-2^31~2^31-1),
    //有一种情况是当转置之后,数据超过了int型的范围,那么最后以此得到的值就不是原值的转置,
    //tmp/10后也就和ans不相同了,通过这个判断,来跳出超过范围的情况
    
if(tmp/10!=ans)
      
return 0;
    ans
=tmp;
    //每次迭代进行“/”操作,相当于去掉个位数,一直迭代到x的值为0
    x=x/10;
   }
  
return ans;
}

这段代码的可取之处在于其简洁性,在对于之后的题目也有一些帮助。

对于int型转罗马数字的一点设想代码

leetcode链接:https://leetcode.com/problems/integer-to-roman/description/

/*****************
Problem:Roman numerals are represented by seven different symbols: I, V, X, L, C, D and M.
@brief 只是简单的使用上面的模板,说明其代码的简洁性
@para num 输入的数据
*****************/
string intToRoman(int num) {
    string tmp="";
    string ans="";
    int i=0;  
    while(x)
    {
        //此处可以通过一个函数转换例如 toRomanOne(x%10,i),来完成单个的数字转换
        tmp=x%10+ans;
        ans=tmp;
       //通过i来控制x的取值是在什么位数上的
        i++;  
        x=x/10;
    }
} 
string toRomanOne(int a,int i)
{
    ...
}       

下面是傻瓜而又amazing的代码
//通过1~10给每个位数上的罗马数字排序,然后直接根据int型上位数的数值,作为数组的序号进行取值,完美。
public
static String intToRoman(int num) { String M[] = {"", "M", "MM", "MMM"}; String C[] = {"", "C", "CC", "CCC", "CD", "D", "DC", "DCC", "DCCC", "CM"}; String X[] = {"", "X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC"}; String I[] = {"", "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX"};
//此处细节,获取某个位置上的数可以通过先高一位的求模再进行整数除法运算
return M[num/1000] + C[(num%1000)/100] + X[(num%100)/10] + I[num%10]; }

 

 

 

  

posted @ 2018-10-23 11:22  bookdrip  阅读(97)  评论(2)    收藏  举报