回文算法的对于整型数据的一些巧妙的处理
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]; }

浙公网安备 33010602011771号