剑指offer之11-15题解


目录

  1. 二进制中1的个数
  2. 数值的整数次方
  3. 调整数组顺序使奇数位于偶数前面
  4. 链表中第k个节点
  5. 反转链表

11. 二进制中1的个数

(一)题目描述

(二)思路

  1. n & n-1,该位运算去除n的位级表示中最低的那一位。
  2. 调用Integer.bitCount()方法:返回二进制补码中1位的个数

(三)代码实现

  1. 代码实现
  public class Solution {public int NumberOf1(int n) {int count = 0;while (n != 0) {count++;n &= (n - 1);}return count;}}
  1. 调用 Integer.bitCount()方法实现
public class Solution {public int NumberOf1(int n) {return Integer.bitCount(n);}
}

12. 数值的整数次方

(一)题目描述

(二)思路

  1. 直接用Math.pow()方法实现。
  2. 使用递归方法实现

(三)代码实现

  1. Math.pow()方法实现
public class Solution {public double Power(double base, int exponent) {return Math.pow(base,exponent);}
}
  1. 递归实现
public class Solution {public double Power(double base, int exponent) {if (exponent == 0) {return 1;}if (exponent == 1) {return base;}boolean isNegative = false;if (exponent < 0) {exponent = -exponent;isNegative = true;}double pow = Power(base * base, exponent / 2);if (exponent % 2 != 0) {pow = pow * base;}return isNegative ? 1 / pow : pow;}
}

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

(一)题目描述

(二)思路

  1. 关键思路都是找出奇数和偶数,我的思路是创建两个队列,一个进奇数,一个进偶数。最后依次加入数组即可。

  2. 大佬思路

    1. 先找到奇数个数
    2. 复制数组,遍历到偶数,奇数修改原数组即可。

(三)代码实现

  1. 队列实现代码
import java.util.LinkedList;
import java.util.Queue;
public class Solution {public void reOrderArray1(int[] array) {if (array == null) {return;}Queue queue1 = new LinkedList();Queue queue2 = new LinkedList();for (int i = 0; i < array.length; i++) {if (array[i] % 2 == 1) {queue1.offer(array[i]);} else {queue2.offer(array[i]);}}int n = 0;while (!queue1.isEmpty()) {array[n++] = (int) queue1.poll();}while (!queue2.isEmpty()) {array[n++] = (int) queue2.poll();}}
}
  1. 大佬代码
import java.util.Arrays;
public class Solution {public void reOrderArray(int[] array) {int count = 0;for (int x: array){if (x%2!=0){count++;}}int[] clone = array.clone();int i = 0;int j = count;for (int num : clone){if (num%2!=0){array[i++] = num;}else {array[j++] = num;}}}
}

14. 链表中第k个节点

(一)题目描述

(二)思路

  • 思路一:设链表长度为N。设置两个指针P1和P2,先让P1移动K个节点,则还有N-K个节点可以移动。此时让P1和P2同时移动,可以知道当P1移动到链表结尾时,P2移动到N-K个节点,该位置就是倒数第K个节点。
  • 思路二:创建一个栈,将节点全部放进去,再弹出K个节点,第K个就是倒数第K个节点。

(三)代码实现

  1. 思路一代码实现
/*
public class ListNode {int val;ListNode next = null;ListNode(int val) {this.val = val;}
}*/
import java.util.Stack;
public class Solution {public ListNode FindKthToTail(ListNode head, int k) {if (head == null)return null;ListNode p1 = head;while (p1 != null && k-- > 0)p1 = p1.next;if (k > 0)return null;ListNode p2 = head;while (p1 != null) {p1 = p1.next;p2 = p2.next;}return p2;}
}
  1. 思路二代码实现
/*
public class ListNode {int val;ListNode next = null;ListNode(int val) {this.val = val;}
}*/
import java.util.Stack;
public class Solution {public ListNode FindKthToTail(ListNode head,int k) {if (head==null||k<0){return null;}Stack<ListNode> stack = new Stack<>();while (head!=null){stack.push(head);head = head.next;}if (stack.size()<k){return null;}for (int i = 0; i < k; i++) {head = stack.pop();}return head;}
}

15. 反转链表

(一)题目描述

(二)思路

  1. 递归

  2. 迭代:头插法

(三)代码实现

  1. 递归代码实现
/*
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||head.next ==null){return head;}ListNode next = head.next;head.next = null;ListNode newHead = ReverseList(next);next.next = head;return newHead;}
}
  1. 迭代代码实现
public ListNode ReverseList(ListNode head) {ListNode newList = new ListNode(-1);while (head !=null){ListNode next = head.next;head.next = newList.next;newList.next = head;head = next;}return newList.next;}

剑指offer之11-15题解相关推荐

  1. 剑指 Offer第 11 天 双指针(简单)

    第 11 天双指针(简单) 剑指 Offer 18. 删除链表的节点 题目描述 题目思路及代码 剑指 Offer 22. 链表中倒数第k个节点 题目描述 题目思路及代码 推荐给大家一句话 剑指 Off ...

  2. 【剑指offer】java版题解(持续更新)

    本文为刷[剑指]备战校招的过程,持续更新 备战虽晚但卷,共勉! 目录,按刷题时间排序 斐波那契数列 用两个栈实现队列 二维数组中的查找 包含min函数的栈 从尾到头打印链表 反转链表 复杂链表的复制 ...

  3. 剑指offer面试题15:链表中倒数第K个节点

    题目:输入一个链表,输出该链表的倒数第K个节点.为了符合大多数人的习惯,本题从1开始计数,即链表尾节点是倒数第一个节点. 解题思路: 解法一:一般情况下,单向链表无法从后一个节点获取到它前面的节点,可 ...

  4. [剑指offer]面试题15:链表中倒数第k个结点

    面试题15:链表中倒数第k个结点 题目:输入一个链表,输出该链表中倒数第 k 个结点.为了符合大多数人的习惯,本题从1 开始计数,即链表的尾结点是倒数第1 个结点.例如一个链表有6个结点,从头结点开始 ...

  5. 剑指Offer - 面试题15. 二进制中1的个数(位运算)

    1. 题目 请实现一个函数,输入一个整数,输出该数二进制表示中 1 的个数.例如,把 9 表示成二进制是 1001,有 2 位是 1.因此,如果输入 9,则该函数输出 2. 示例 1: 输入:0000 ...

  6. 剑指offer面试题[15]-链表中倒数第K个结点

    题目描述 输入一个链表,输出该链表中倒数第k个结点. 思路: 假设链表有n个结点,那么倒数第k个结点就是从头结点开始的第n-k+1个结点,我们只要从头结点开始往后走n-k+1步就可以了.那么问题来了: ...

  7. 剑指offer面试题15. 二进制中1的个数(位运算)

    题目描述 请实现一个函数,输入一个整数,输出该数二进制表示中 1 的个数.例如,把 9 表示成二进制是 1001,有 2 位是 1.因此,如果输入 9,则该函数输出 2. 思路 详见链接 代码 cla ...

  8. 剑指offer——面试题15:链表中倒数第k个结点

    Solution1: 典型的双指针题目.但要考虑到很多边界条件! 注意此题中陷阱很多,具体看书中解释 20181008修改代码 /* struct ListNode {int val;struct L ...

  9. C++剑指offer刷题笔记

    说明:本文是本人刷题后整理的剑指offer1-68题的题解笔记,编程语言为c++. 主要参考刷题笔记网址:leetcode剑指offer 次要参考刷题笔记网址:牛客剑指offer 剑指OFFER 面试 ...

  10. 【剑指offer】数据结构——数组

    目录 数据结构--数组 直接解 [剑指offer]03.数组中重复的数字 排序法 集合法 原地置换 [剑指offer]04. 二维数组中的查找 [剑指offer]29. 顺时针打印矩阵 [剑指offe ...

最新文章

  1. Java Web知识梳理
  2. 为什么Java大神,都在看Spring Boot和Spring Cloud的书?
  3. 纯干货:CMOS图像传感器产业趋势和主要厂商
  4. SVN 批量添加文件到版本库的命令脚本
  5. Bind9的dns解析服务
  6. fiddler怎么修改服务器返回数据,基于Fiddler实现修改接口返回数据进行测试
  7. mysql count优化_MySQL count()函数及其优化
  8. Java性能分析点滴
  9. g6-editor 使用
  10. CountDownLatch和Semaphore使用场景
  11. 活动、节假日、促销等营销方式的因果效应评估——特征工程篇(一)
  12. android基于xposed框架,学习笔记:Android Xposed 框架入门
  13. AXURE RP 原型图绘制手册
  14. 宽带多拨-路由器设置
  15. Intel opreation mode
  16. 根文件系统的构建与分析(一)之流程分析 http://blog.csdn.net/jianchi88/article/details/7682901
  17. 神经网络训练怎么看收敛,神经网络收敛的定义是
  18. 无驱、代码自动植入:新一代软件保护锁——圣天诺LDK-HL
  19. 算法4 随书 IDE:DrJava 在 Win10 下高分屏字体太小问题解决
  20. 无线串口服务器的辐射范围,揭真相!无线路由器的辐射到底可怕不?

热门文章

  1. storm 动态设置并发度
  2. 150929.js过完
  3. 疯狂ios讲义之疯狂连连看游戏简介
  4. 黑客攻击澳大利亚政府网站 抗议互联网过滤器
  5. CodeForces - 1459C Row GCD(数论+推公式)
  6. CodeForces - 1454E Number of Simple Paths(基环树+思维)
  7. HDU - 4333 Revolving Digits(扩展KMP)
  8. js中同时得到整数商及余数_js和vue实现时分秒倒计时的方法
  9. STL 之accumulate,adjacent_difference,inner_product,partial_sum
  10. COM编程之一 组件