剑指offer题解11-15(java)

11.二进制中1的个数

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

代码

理解题意的时候,出现了小偏差,输入的已经是二进制数,不需要转换。

无脑解法可以转换成字符串进行判断

链接:https://www.nowcoder.com/questionTerminal/8ee967e43c2c4ec193b040ea7fbb10b8?answerType=1&f=discussion
来源:牛客网

举个例子:一个二进制数1100,从右边数起第三位是处于最右边的一个1。减去1后,第三位变成0,它后面的两位0变成了1,而前面的1保持不变,因此得到的结果是1011.我们发现减1的结果是把最右边的一个1开始的所有位都取反了。这个时候如果我们再把原来的整数和减去1之后的结果做与运算,从原来整数最右边一个1那一位开始所有位都会变成0。如1100&1011=1000.也就是说,把一个整数减去1,再和原整数做与运算,会把该整数最右边一个1变成0.那么一个整数的二进制有多少个1,就可以进行多少次这样的操作。

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

12.数值的整数次方

给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。

保证base和exponent不同时为0

代码

public class Solution {
    public double Power(double base, int exponent) {
        if(base==0){
            return 0.0d;
        }
        double res=1.0d;
        int e=exponent>0?exponent:-exponent;
        for(int i=1;i<=e;i++){
            res*=base;
        }
        return exponent>0?res:1/res;
  }
}

13.调整数组顺序使奇数在偶数前面

代码

我的代码

没有设置截至条件,导致排完偶数后,会重复排序

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

参考

public class Solution {
    public void reOrderArray(int [] array) {
        //相对位置不变,稳定性
        //插入排序的思想
        int m = array.length;
        int k = 0;//记录已经摆好位置的奇数的个数
        for (int i = 0; i < m; i++) {
            if (array[i] % 2 == 1) {
                int j = i;
                while (j > k) {//j >= k+1
                    int tmp = array[j];
                    array[j] = array[j-1];
                    array[j-1] = tmp;
                    j--;
                }
                k++;
            }
        }
    }
}

思想是类似的。

14.输入一个链表,输出该链表中倒数第k个结点。

代码

  1. 按顺序将链表元素加入arraylist。
  2. 倒数第k个元素下标为len-k。
  3. 注意k的范围和链表是否为空。
/*
public class ListNode {
    int val;
    ListNode next = null;

    ListNode(int val) {
        this.val = val;
    }
}*/
import java.util.ArrayList;
public class Solution {
    public ListNode FindKthToTail(ListNode head,int k) {
        ArrayList<ListNode> vals=new ArrayList<ListNode>();
      int len=0;
       
        while(head!=null){
            vals.add(head);
            head=head.next;
            len++;
          
        }
        if(k>len||k==0||len==0){
            return null;
          
        }
       
        return vals.get(len-k);

    }
}

15.输入一个链表,反转链表后,输出新链表的表头。

代码

/*
public class ListNode {
    int val;
    ListNode next = null;

    ListNode(int val) {
        this.val = val;
    }
}*/
public class Solution {
    public ListNode ReverseList(ListNode head) {
        if(head==null){
            return null;
        }
        else{
        //不为空
        //创建新的头节点
           ListNode newhead=new ListNode(head.val);
            head=head.next;
        while(head!=null){
            ListNode temp=new ListNode(head.val);
            //新建节点指向newhead
            temp.next=newhead;
            //将新节点赋予newhead
            newhead=temp;
            head=head.next;
        }
            return newhead;
        }
        
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值