[LeetCode][9]Palindrome Number解析与StringBuilder.reverse()源码实现 -Java实现

Q:

Determine whether an integer is a palindrome. Do this without extra space.

A:

这个题目说实话,我是后半句没有看懂的。。。这个without extra space不知道是不是单纯的只是不让用多余空间,如果我理解错了,希望有人能教我一下。。

我们之前解过一个回文的题目回文,感觉这题是不是简单了点,上次用的解法直接套就可以了。就是可能出现了多余的空间。考虑到不能使用多余的空间来操作我之前分析了一个回文的特性:

1、回文列有n个的第i项和n-i相等

如果我们使用这个来判断的话应该时间复杂度是O(n)准确点说是O(n/2),我们能更少点吗?

这样,我们知道JDK中有一个函数StringBUilder的reverse()方法,我下面贴出来大家研讨一下(截取部分):

	private static char[] method(String i) {
		// TODO Auto-generated method stub
		char[] value = i.toCharArray();
		int n = value.length-1;
		for (int j = (n-1) >> 1; j >= 0; j--) {
            int k = n - j;
            char cj = value[j];
            char ck = value[k];
            value[j] = ck;
            value[k] = cj;
        }
		return value;
	}

可以看出来jdk中的运算使用了位运算,并且从正中间开始互换数组函数的。这里面有个很巧妙的地方int j=(n-1)>>1;这个-1特别巧妙,直接解决了奇偶数的问题,如果原本是奇数,那么我们直接跳过中间一位的调换,如果偶数我们就会从中间调换。但是我们还面临一个问题就是如何不使用多余的空间来把一个int型的数字分割成一个个的数字。最后想遍了办法也不能借鉴上面的代码,最终借鉴了以前的一个reverseInteger的代码 点击打开链接

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		System.out.println(method(12321));
	}

	private static boolean method(int i) {
		// TODO Auto-generated method stub
		int reverse = 0;
		while(i>reverse){
			reverse =(reverse<<3)+(reverse<<1)+i - ((((i * 52429) >>> 19) << 3) + (((i * 52429) >>> 19) << 1));//r=i-q*10,截出最后一位
			i = (i * 52429) >>> 19;
		}
		System.out.println(i);
		System.out.println(reverse);
		return reverse==i||reverse/10==i;
	}

最后真是没办法了,不能做到不用多余的空间,最后的只对比一般借鉴了别人的一个解法,感觉还是不错的。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值