[关闭]
@pastqing 2015-04-11T21:46:17.000000Z 字数 1289 阅读 1758

每日一题系列

每日一题



1.对于字节按位逆序

题目描述: 对于给出一个8字节或者32字节无符号整数, 将其按位逆序。举个例子就是‘abcdefg’ 要转化为‘gfedcba’, 对于int型整数来说就按照其二进制位来进行反序。
下面给出一个解题方法(leetcode 已ac):

  1. public class Solution {
  2. //这里默认n为无符号整数, 不在进行判断处理
  3. public int reverseBits(int n) {
  4. int result = 0;
  5. for( int i = 0; i < 32; ++i) {
  6. result = (result << 1) | ( n & 1);
  7. n >>= 1;
  8. }
  9. return result;
  10. }
  11. }

这个方法的核心思想就是:取到输入整数(n)的最后一位,时左移一位result, 然后填充到输出整数(result)中,这里需要注意不能将result的左移操作放在填充之后, 因为这样会多移动一次, 导致结果变为0

可以看出以上的方法是最基本, 最容易的方法, 效率非常差。对于位运算一直不太熟, 借此算法题来算是简单回顾一下。值得一提的是, 本题有很多优美的解法, 值得我们学习。
此题的优美解法在这里


2.Atoi百做不厌的字符串转整数

题目描述: 字符串转换成整数:输入一个表示整数的字符串,把该字符串转换成整数并输出,例如输入字符串”-123”,则输出整数-123。

这个题目的算法思想很简单,但是考察的细节就很不简单!!对于一个字符串的各种细节的判断是这道题的关键。以前用c写过好多次,每次都会有毛病,这次用java写还是不少错。建议大家去LeetCode上去提交一下代码,你会发现有很多你没有考虑到的地方。

下面贴上我的代码(未AC):

  1. public class Atoi {
  2. public static int atoi(String str) throws Exception {
  3. if( null == str ||
  4. "".equals(str)) {
  5. throw new NullPointerException();
  6. }
  7. int i = 0;
  8. //处理空
  9. while( str.charAt(i) == ' ') {
  10. i++;
  11. }
  12. int flag = 1;
  13. int result = 0;
  14. int item = str.charAt(i);
  15. if( item == '+' || item == '-' ) {
  16. if( item == '-') {
  17. flag = -1;
  18. }
  19. if( str.length() == 1) {
  20. throw new Exception("输入的数字不对");
  21. }
  22. i++;
  23. }
  24. while( i < str.length()) {
  25. item = str.charAt(i++) - '0'; //得到具体数字
  26. if( item >= 0 && item <= 9) {
  27. result = result * 10 + item;
  28. }else
  29. throw new Exception("字符串格式错误");
  30. }
  31. return result * flag;
  32. }
  33. }

在提交代码的过程中,LeetCode给我的结果是这样的:此处输入图片的描述很显然,这里是没有考虑溢出的情况。接下来的修改就是要加上相关溢出情况的考虑以及好好学习JDKInteger.parseInt是如何编写的。

未完待续。

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注