1、二进制中1的个数

题目:输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。

思路:解决这道题的思路比较简单,就是将整数转换为二进制,然后得到二进制中1的个数,有两种方法:

  • 方法一

直接调用Integer中的库函数toBinaryString转换为二进制,把该二进制转换为字符数组,循环判断字符是否为1。

  • 方法二

采用移位的策略,假设数字12转换为二进制为1100,减1后就变为1001,如果将(1100)&(1001)=1000,利用这个特性,我们可以计算出二进制中1的个数。

调用库函数

  •  
public class Solution {    public int NumberOf1(int n) {        int result=0;      char[] ch=Integer.toBinaryString(n).toCharArray();        for(int i=0;i<ch.length;i++){            if(ch[i]=='1'){                result++;            }        }        return result;    }}
 

移位操作

  •  
public class Solution {    public int NumberOf1(int n) {        int result=0;      while(n!=0){          result++;          n=n&(n-1);      }        return result;    }}
 

2、数值的整数次方

题目:给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。保证base和exponent不同时为0

思路:这道题有个陷阱需要考虑,就是exponent的正负不确定,所以这两种情况都要考虑到,

假设exponet为正,我们的思路通常是这样的:

①假如exponent为0,直接返回1

②假如exponent,不为0,我们可以利用for循环不断的累乘

假如exponent为负,我们不妨对exponent=-exponent,然后利用exponent为正式计算base的exponent,对于最后的输出结果,我们只需要对结果取倒数即可。

代码

 
  •  
public class Solution {    public double Power(double base, int exponent) {        double result=base;        int n=exponent;        if(exponent<0){            exponent=-exponent;        }        if(exponent==0){            return 1;        }        for(int i=1;i<exponent;i++){            result*=base;        }        return n<0 ? 1/result : result;  }}

3、调整数组数组顺序使奇数位于偶数前面

题目:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。

思路:这道题关键点在于要保证奇数和奇数、偶数和偶数之间的相对位置不变,所以这道题有两种方法可以解决

  • 冒泡排序

冒泡排序是两两比较数组中的相邻元素,我们可以把这道题目看作为冒泡排序的变种,将交换条件变为判断相邻元素是否为奇数、偶数

  • 插入排序

插入排序是通过移位的方式来完成交换的,我们也是同样的将条件变为判断相邻元素是否为奇数、偶数来到达排序的目的

冒泡排序

  •  
public class Solution {    public void reOrderArray(int [] array) {        for(int i=0;i<array.length-1;i++){            for(int j=0;j<array.length-1-i;j++){                if(array[j]%2==0&&array[j+1]%2!=0){                    int temp=array[j];                    array[j]=array[j+1];                    array[j+1]=temp;                }        }        }    }}
 

插入排序

  •  
public class Solution {    public void reOrderArray(int [] array) {        //插入坐标        int insertIndex=0;        //要插入的值        int insertValue=0;        //循环比较判断        for(int i=1;i<array.length;i++){            insertIndex=i-1;            insertValue=array[i];            while(insertIndex>=0&&array[insertIndex]%2==0&&insertValue%2!=0){                array[insertIndex+1]=array[insertIndex];                insertIndex--;            }            if(insertIndex+1!=i){                array[insertIndex+1]=insertValue;            }        }    }}
 

4、链表中倒数第K个结点

题目:输入一个链表,输出该链表中倒数第k个结点。

思路:这道题的关键点在于倒数第K个结点,最简单的做法就是先计算出链表中元素的个数count,然后利用index=(count-k)判断结点在链表中的正序位置。

代码:

  •  
/*public class ListNode {    int val;    ListNode next = null;
ListNode(int val) { this.val = val; }}*/public class Solution { public ListNode FindKthToTail(ListNode head,int k) { if(head==null){ return null; } if(k<=0){ return null; } int count=1; ListNode node=head; while(head.next!=null){ head=head.next; count++; } count=count-k; if(count<0){ return null; } for(int i=0;i<count;i++){ node=node.next; } return node; }}
 

看了这篇文章,你是否「博学」了剑指offer第11-14题_链表