@pastqing
2015-04-11T21:46:17.000000Z
字数 1289
阅读 1758
每日一题
题目描述: 对于给出一个8字节或者32字节无符号整数, 将其按位逆序。举个例子就是‘abcdefg’ 要转化为‘gfedcba’, 对于int型整数来说就按照其二进制位来进行反序。
下面给出一个解题方法(leetcode 已ac):
public class Solution {
//这里默认n为无符号整数, 不在进行判断处理
public int reverseBits(int n) {
int result = 0;
for( int i = 0; i < 32; ++i) {
result = (result << 1) | ( n & 1);
n >>= 1;
}
return result;
}
}
这个方法的核心思想就是:取到输入整数(n)的最后一位,时左移一位result, 然后填充到输出整数(result)中,这里需要注意不能将result的左移操作放在填充之后, 因为这样会多移动一次, 导致结果变为0
可以看出以上的方法是最基本, 最容易的方法, 效率非常差。对于位运算一直不太熟, 借此算法题来算是简单回顾一下。值得一提的是, 本题有很多优美的解法, 值得我们学习。
此题的优美解法在这里
题目描述: 字符串转换成整数:输入一个表示整数的字符串,把该字符串转换成整数并输出,例如输入字符串”-123”,则输出整数-123。
这个题目的算法思想很简单,但是考察的细节就很不简单!!对于一个字符串的各种细节的判断是这道题的关键。以前用c写过好多次,每次都会有毛病,这次用java写还是不少错。建议大家去LeetCode上去提交一下代码,你会发现有很多你没有考虑到的地方。
下面贴上我的代码(未AC):
public class Atoi {
public static int atoi(String str) throws Exception {
if( null == str ||
"".equals(str)) {
throw new NullPointerException();
}
int i = 0;
//处理空
while( str.charAt(i) == ' ') {
i++;
}
int flag = 1;
int result = 0;
int item = str.charAt(i);
if( item == '+' || item == '-' ) {
if( item == '-') {
flag = -1;
}
if( str.length() == 1) {
throw new Exception("输入的数字不对");
}
i++;
}
while( i < str.length()) {
item = str.charAt(i++) - '0'; //得到具体数字
if( item >= 0 && item <= 9) {
result = result * 10 + item;
}else
throw new Exception("字符串格式错误");
}
return result * flag;
}
}
在提交代码的过程中,LeetCode给我的结果是这样的:很显然,这里是没有考虑溢出的情况。接下来的修改就是要加上相关溢出情况的考虑以及好好学习JDK中Integer.parseInt是如何编写的。
未完待续。