今天看到一道算法题。说让整数逆序,用递归算法实现,书上的源码是C语言实现的,
以下为C语言版:
void convert(int *result, int n) {
if(n>=10)
convert(result+1, n/10);
*result = n%10;
}
int main(int argc, char* argv[]) {
int n = 123456789, result[20] ={};
convert(result, n);
printf("%d: ", n);
for(int i=0; i<9; i++)
printf("%d", result[i]);
}
/**
* 将一整数逆序。递归实现
* @author Ningkui
*
*/
public class ReverseTest {
//幂次方数,用于递归方法中
static int i = 1;
//临时字符串。用于存储递归方法的计算过程中产生的值。
static StringBuffer temporary = new StringBuffer();
//主方法
public static void main(String[] args) {
//原始数据
int number = 123456789;
System.out.println("逆序前:"+number);
/*
* 递归方法
*/
converts(number);
System.out.println("逆序后得到的值:"+temporary);
}
/**
* 递归实现逆序主要方法
* @param number
*/
private static void converts(int number) {
if(Integer.toString(number).length() != i-1){
//计算每一位上的值。通过取余获得,例如1234,获得1000,200,30,4
long flag = Math.round(number%Math.pow(10, i));
//取多位值的首位,如1000取1,500取5,30取3,4取4
flag = (long) (flag/Math.pow(10, i-1));
//将上步骤获得的值添加到临时字符串中
temporary.append(flag);
//更新幂次方数
i++;
//递归,依次对高位进行操作获取。
converts(number);
}
}
}
后来想了一下,其实将值转化为字符串在切割成一个一个数字进行前后对调也是可以的。
/**
* 将一整数逆序。字符串切割实现
* @author Ningkui
*
*/
public class ReverseTest {
//主方法
public static void main(String[] args) {
//原始数据
int number = 123456789;
System.out.println("逆序前:"+number);
/*
* 字符串切割实现
*/
// convertsBySpilt(number);
System.out.println("逆序后得到的值:"+number);
}
/**
* 字符串切割实现逆序
* @param number
*/
private static void convertsBySpilt(int number){
//将测试数据转换为字符串类型。
String str = Integer.toString(number);
//将数据按一位数字拆分,并放入到数组中。
char[] chars = str.toCharArray();
//声明i,j,分别从前和后往中间靠拢,循环交换前后对应的值,
for(int i=0,j=chars.length-1;i<j;i++,j--){
char temp = chars[i];
chars[i]=chars[j];
chars[j] = temp;
}
}
}
如果大家有其他方法实现的,欢迎讨论交流。