美文网首页
剑指offer(11-15)

剑指offer(11-15)

作者: yaco | 来源:发表于2020-09-18 17:50 被阅读0次

    JZ11

    问题描述:

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

    思路:

    • 使用一个计数器32,遍历每个位置的元素
    • 将当前数和1相与,如果当前的低位是1,那么相与的结果为1,如果当前低位是0,那么相与的结果为0;
    • 然后使用一个res变量记录当前位置为1的个数

    代码:

    public class Solution {
        public int NumberOf1(int n) {
            int res = 0;
            for(int i = 0; i < 32; i++) {
                if((n & 1) == 1) {
                    res++;
                }
                n = n >> 1;
            }
            return res;
        }
    }
    

    JZ12

    问题描述:

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

    保证base和exponent不同时为0

    思路:

    • 考虑正负号
    • 当exponent为正数的时候,直接while循环相乘即可
    • 当exponent为负数的时候,首先必须将exponent取正,然乎while求出累计和之后,求倒数即可

    代码:

    public class Solution {
        public double Power(double base, int exponent) {
            if(base == 0) return 0;
            if(exponent == 0) return 1;
            boolean f = exponent > 0 ? true : false;
            exponent = Math.abs(exponent);
            double res = 1;
            while(exponent-- > 0) {
                res *= base;
            }
            return f ? res : 1 / res;
        }
    }
    

    JZ13

    问题描述:

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

    思路一:

    • 创建一个辅助数组
    • 第一次遍历原始数组的时候,将所有的奇数值加入数组
    • 第二次遍历数组的时候,将所有的偶数值加入数组
    • 第三次遍历将辅助数组中的所有元素全部放入原始数组中

    思路二:

    • 使用冒泡排序的思想(每次都是把最后面的偶数沉到数组底部)
    • 每次遍历到奇数的时候跳过
    • 当前位置是偶数且他下一个数也是偶数,跳过
    • 当前位置是偶数且他下一个数是奇数,则交换当前的数和他下一个数

    代码:

    // 思路一:
    public class Solution {
        public void reOrderArray(int [] array) {
            int n = array.length;
            int[] t = new int[n];
            int index = 0;
            for(int i = 0; i < n; i++) {
                if((array[i] & 1) == 1) {
                    t[index++] = array[i];
                }
            }
            for(int i = 0; i < n; i++) {
                if((array[i] & 1) == 0) {
                    t[index++] = array[i];
                }
            }
            for(int i = 0; i < n; i++) {
                array[i] = t[i];
            }
        }
    }
    
    // 思路二:
    public class Solution {
        public void reOrderArray(int [] array) {
            int n = array.length;
            for(int i = n - 1; i > 0; i--) {
                for(int j = 0; j < i; j++) {
                    if((array[j] & 1) == 0 && ((array[j + 1] & 1) == 1)) {
                        swap(array, j, j + 1);
                    }
                }
            }
        }
        
        private void swap(int[] arr, int i, int j) {
            int temp = arr[i];
            arr[i] = arr[j];
            arr[j] = temp;
        }
    }
    

    JZ14

    问题描述:

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

    思路一:

    • 首先让一个指针t先走k步
    • 然后让r从head开始,和t指针同时向后走,如果t指针到null的时候,然后r指针即可

    代码:

    public class Solution {
        public ListNode FindKthToTail(ListNode head,int k) {
            ListNode t = head;
            while(k-- > 0) {
                if(t == null) return null;
                t = t.next;
            }
            ListNode r = head;
            while(t != null) {
                r = r.next;
                t = t.next;
            }
            return r;
        }
    }
    

    JZ15

    问题描述:

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

    思路一:

    • 遍历的方式实现

    代码:

    public class Solution {
        public ListNode ReverseList(ListNode head) {
            if(head == null || head.next == null) return head;
            ListNode pre = null, next = null;
            while(head != null) {
                next = head.next;
                head.next = pre;
                pre = head;
                head = next;
            }
            return pre;
        }
    }
    

    相关文章

      网友评论

          本文标题:剑指offer(11-15)

          本文链接:https://www.haomeiwen.com/subject/iuwjyktx.html