剑指offer
ddd_1206
这个作者很懒,什么都没留下…
展开
-
面试题16:反转链表
/*public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; }}*/public class Solution { public ListNode ReverseList(ListNod原创 2017-06-18 22:45:30 · 186 阅读 · 0 评论 -
面试题45:圆圈中最后剩下的数字
题目:0,1,...n-1这n个数字排成一个圆圈,从数字0开始每次从这个圆圈里删除第m个数字,求出这个圆圈里剩下的最后一个数字。思路:1、环形链表模拟圆圈创建一个n个节点的环形链表,然后每次在这个链表中删除第m个节点;可以用std::list来模拟环形链表,list本身不是环形结构,因此每当迭代器扫描到链表末尾的时候,需要将迭代器移到链表的头部。原创 2017-06-27 21:15:09 · 200 阅读 · 0 评论 -
面试题44:扑克牌的顺子
/* 满足三个条件: 1.max - min <5(除0以外的max/min),所以a[4]-a[numOfZero]<=4 2.除了0以外不能有重复数组出现; 3.输入的数组长度一定为5;*/import java.util.Arrays;public class Solution { public boolean isContinuous(int [] numbe原创 2017-06-27 20:27:01 · 239 阅读 · 0 评论 -
面试题43: n个骰子的点数
原题:把n个骰子扔到地上,所有骰子朝上一面的点数之后为s. 输入n,打印出s所有可能的值出现的概率。(每个骰子6个面,点数从1到6)解法一:基于递归,时间效率不高递归的思想一般是分而治之,把n个骰子分为第一个和剩下的n-1个。先计算第一个骰子每个点数出现的次数,再计算剩余n-1个骰子出现的点数之和。求n-1个骰子的点数之的方法和前面讲的一样,即再次把n-1个骰子分成两堆------原创 2017-06-27 19:30:39 · 422 阅读 · 0 评论 -
面试题41:和为s的两个数字VS和为s的连续正数序列
题目一:输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。如果有多个数字的和等于s,输出任意一对即可。例如输入数组{1,2,4,7,11,15}和数字15.由于4+11=15,因此输出4和11.在面试的时候,很重要的一点是应聘者要表现出很快的反应能力。只要想到一个办法,应聘者就可以立马告诉面试官,即使这个办法不一定是最好的。比如这个问题,很多人会立即能想原创 2017-06-27 09:32:40 · 300 阅读 · 0 评论 -
面试题40:数组中只出现一次的数字
题目:一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。思路整理一下:首先交待一下异或的基本性质:2个相同的数异或等于0,任何数与0异或都是本身,且异或操作(^)满足结合律和交换律。再来考虑一种简单一点的情况:一个数组中只有一个元素出现唯一的一次,而有其他元素都出现2次。那么我原创 2017-06-26 22:43:22 · 230 阅读 · 0 评论 -
面试题42:翻转单词顺序VS左旋转字符串
一、翻转单词顺序首先反转字符串,然后再反转字符串中的每一个子字符串。public class Solution { public String ReverseSentence(String str) { if(str.length()==0||str.isEmpty()) return str; char[] chars=str.toCharArra原创 2017-06-27 15:50:56 · 425 阅读 · 0 评论 -
面试题39:二叉树的深度
二叉树深度题目描述: 输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。求二叉树的深度,有三种方法: 1. 递归,这也是很多人非常容易想到的,递归实际也是深度优先的思想(DFS),时间复杂度为O(lgN),但是空间复杂度最坏为O(N),当二叉树退化为链表的时候。 2. 循环,这种方法不会有递归方法原创 2017-06-26 19:37:41 · 248 阅读 · 0 评论 -
面试题54:表示数值的字符串
public class Solution { public boolean isNumeric(char[] str) { if(str==null||str.length==0) return false; int index=0; if(str[index]=='+'||str[index]=='-'){原创 2017-07-14 11:40:45 · 173 阅读 · 0 评论 -
面试题38:数字在排序数组中出现的次数
public class Solution { public int GetNumberOfK(int [] array , int k) { int length = array.length; if(length == 0){ return 0; } int firstK = getFirstK(a原创 2017-06-26 16:45:56 · 179 阅读 · 0 评论 -
面试题37:两个链表的第一个公共结点
解法一:最短的代码,不用记长度 用两个指针扫描”两个链表“,最终两个指针到达 null 或者到达公共结点。//原理其他方法一样,写法比较简单,同时代码有解释。class Solution {public: ListNode* FindFirstCommonNode(ListNode* pHead1, ListNode* pHead2) {原创 2017-06-26 15:16:25 · 252 阅读 · 0 评论 -
面试题36:数组中的逆序对
public class Solution { public int InversePairs(int [] array) { int len=array.length; if(array==null||len==0) return 0; int [] copy = new int[len]; for(原创 2017-06-26 13:52:52 · 266 阅读 · 0 评论 -
面试题35:第一个只出现一次的字符
题目描述在一个字符串(1位置import java.util.HashMap;public class Solution { public int FirstNotRepeatingChar(String str) { if(str==null||str.length()==0) return -1;原创 2017-06-26 10:07:27 · 221 阅读 · 0 评论 -
面试题34:丑数
public class Solution { public int GetUglyNumber_Solution(int index) { if(index<=0) return 0; int[] uglyNumbers=new int[index]; uglyNumbers[0]=1; int num=1原创 2017-06-25 23:16:09 · 195 阅读 · 0 评论 -
面试题33:把数组排成最小的数
* 解题思路: * 先将整型数组转换成String数组,然后将String数组排序,最后将排好序的字符串数组拼接出来。关键就是制定排序规则。 * 排序规则如下: * 若ab > ba 则 a > b, * 若ab * 若ab = ba 则 a = b; * 解释说明: * 比如 "3" "31"但是 "331" > "313",所以要将二者拼接起来进行比较import java.util.原创 2017-06-25 22:01:49 · 191 阅读 · 0 评论 -
面试题46:求1+2+3+...+n
题目描述求1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。解法一:使用短路特性解题思路:1.需利用逻辑与的短路特性实现递归终止。 2.当n==0时,(n>0)&&((sum+=Sum_Solution(n-1))>0)只执行前面的判断,为false,然后直接返回0;3.当n>0时,执原创 2017-06-27 22:04:58 · 445 阅读 · 0 评论 -
面试题5:从尾到头打印链表
/*** public class ListNode {* int val;* ListNode next = null;** ListNode(int val) {* this.val = val;* }* }**/import java.util.ArrayLi原创 2017-06-15 15:24:35 · 216 阅读 · 0 评论 -
面试题30:最小的k个数
一、解法一:O(n)的算法,只有当我们可以修改输入的数组时可用import java.util.ArrayList;public class Solution { public ArrayList GetLeastNumbers_Solution(int [] input, int k) { ArrayList aList = new ArrayList();原创 2017-06-23 21:26:42 · 219 阅读 · 0 评论 -
面试题3:二维数组的查找
public class Solution { public boolean Find(int target, int [][] array) { int i=0; int j=array[0].length-1; while(j>=0&&i if(array[i][j]==targe原创 2017-06-14 22:58:38 · 314 阅读 · 0 评论 -
面试题64:数据流中的中位数
思路:为了保证插入新数据和取中位数的时间效率都高效,这里使用大顶堆+小顶堆的容器,并且满足:1、两个堆中的数据数目差不能超过1,这样可以使中位数只会出现在两个堆的交接处;2、大顶堆的所有数据都小于小顶堆,这样就满足了排序要求。核心思路: 1.维护一个大顶堆,一个小顶堆,且保证两点: 1)小顶堆里的全大于 大原创 2017-07-18 19:41:59 · 249 阅读 · 0 评论 -
面试题67:机器人的运动范围
public class Solution { public int movingCount(int threshold, int rows, int cols) { boolean flag[]=new boolean[rows*cols]; int count=movingCountCore(threshold,rows,col原创 2017-07-18 16:20:09 · 323 阅读 · 0 评论 -
面试题66:矩阵中的路径
分析:回溯算法 这是一个可以用回朔法解决的典型题。首先,在矩阵中任选一个格子作为路径的起点。如果路径上的第i个字符不是ch,那么这个格子不可能处在路径上的第i个位置。如果路径上的第i个字符正好是ch,那么往相邻的格子寻找路径上的第i+1个字符。除在矩阵边界上的格子之外,其他格子都有4个相邻的格子。重复这个过程直到路径上的所有字符都在矩阵中找到相应的位置。 由于回朔法的递归特性原创 2017-07-18 15:38:00 · 294 阅读 · 0 评论 -
面试题63:二叉搜索树的的第k个结点
/*public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val = val; }}*/public class Solution { int in原创 2017-07-17 20:27:06 · 191 阅读 · 0 评论 -
面试题65:滑动窗口的最大值
滑动窗口。1)判断是否合法输入。2)合法,则找出0~size-1 中最大值,其坐标为index。3)滑动,判断index是否过期,过期则找到窗口中的最大值的index。添加到list当中。 import java.util.ArrayList;public class Solution { public ArrayList maxInWindows(int [] num, in原创 2017-07-17 22:38:14 · 282 阅读 · 0 评论 -
面试题62:序列化二叉树
/*public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val = val; }}*/public class Solution { String原创 2017-07-17 16:59:10 · 162 阅读 · 0 评论 -
面试题61:按之字型顺序打印二叉树
import java.util.ArrayList;import java.util.Stack;/*public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val =原创 2017-07-17 15:41:58 · 227 阅读 · 0 评论 -
面试题60:把二叉树打印成多行
import java.util.ArrayList;import java.util.*;/*public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val = val原创 2017-07-16 22:41:42 · 198 阅读 · 0 评论 -
面试题59:对称的二叉树
/*思路:首先根节点以及其左右子树,左子树的左子树和右子树的右子树相同* 左子树的右子树和右子树的左子树相同即可,采用递归* 非递归也可,采用栈或队列存取各级子树根节点*//*public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = nul原创 2017-07-16 21:02:03 · 158 阅读 · 0 评论 -
面试题58:二叉树的下一个结点
图见书思路:(1) 若该节点存在右子树:则下一个节点为右子树最左子节点(如图节点 B )(2) 若该节点不存在右子树:这时分两种情况:2.1 该节点为父节点的左子节点,则下一个节点为其父节点(如图节点 D )2.2 该节点为父节点的右子节点,则沿着父节点向上遍历,知道找到一个节点的父节点的左子节点为该节点,则该节点的父节点下一个节点(如图节点 I ,沿着父节点一原创 2017-07-16 20:44:05 · 167 阅读 · 0 评论 -
面试题57:删除链表中重复的结点
算法思想:方法一,递归实现。public class Solution { public ListNode deleteDuplication(ListNode pHead) { if (pHead == null || pHead.next == null) { // 只有0个或1个结点,则返回 return pHead; }原创 2017-07-16 16:51:12 · 235 阅读 · 0 评论 -
面试题56:链表中环的入口结点
如果链表中环 有n个结点,指针P1在链表上向前移动n步,然后两个指针以相同的速度向前移动。 当第二个指针指向环的入口结点时,第一个指针已经围绕着环走了一圈又回到了入口结点。所以首先要得到环中结点的数目。public class 链表中环的入口结点 { //找到一快一满指针相遇处的节点,相遇的节点一定是在环中 public static Lis原创 2017-07-16 15:57:33 · 247 阅读 · 0 评论 -
面试题55:字符流中第一个不重复的数字
如果当前字符流没有存在出现一次的字符,返回#字符。public class Solution { private int[] occurrence=new int[256];//哈希表 private int count=0;//字符在字符流中的位置 public Solution(){ //最开始,哈希表中所有元素都初始化为-1原创 2017-07-16 14:30:53 · 353 阅读 · 0 评论 -
面试题32:从1到n整数中1出现的次数
主要思路:设定整数点(如1、10、100等等)作为位置点i(对应n的各位、十位、百位等等),分别对每个数位上有多少包含1的点进行分析 //根据设定的整数位置,对n进行分割,分为两部分,高位n/i,低位n%i //当i表示百位,且百位对应的数>=2,如n=31456,i=100,则a=314,b=56,此时百位为1的次数有a/10+1=32(最高两位0~31),每一次都包原创 2017-06-25 20:45:51 · 211 阅读 · 0 评论 -
面试题53:正则表达式匹配
当模式中的第二个字符不是“*”时:1、如果字符串第一个字符和模式中的第一个字符相匹配,那么字符串和模式都后移一个字符,然后匹配剩余的。2、如果 字符串第一个字符和模式中的第一个字符相不匹配,直接返回false。而当模式中的第二个字符是“*”时:如果字符串第一个字符跟模式第一个字符不匹配,则模式后移2个字符,继续匹配。如果字符串第一个字符跟模式第一个字符匹配,可以有3种匹原创 2017-07-13 18:51:03 · 227 阅读 · 0 评论 -
面试题19:二叉树的镜像
链接:https://www.nowcoder.com/questionTerminal/564f4c26aa584921bc75623e48ca3011来源:牛客网/*struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int原创 2017-06-19 20:12:05 · 158 阅读 · 0 评论 -
面试题4:替换空格
public class Solution { public String replaceSpace(StringBuffer str) { int num=0; int indexOfOriginal=str.length()-1; for(int i=0;i if(str.charAt(i)==' '){原创 2017-06-15 11:36:26 · 186 阅读 · 0 评论 -
面试题18:树的子结构
/*思路:参考剑指offer1、首先设置标志位result = false,因为一旦匹配成功result就设为true,剩下的代码不会执行,如果匹配不成功,默认返回false2、递归思想,如果根节点相同则递归调用DoesTree1HaveTree2(),如果根节点不相同,则判断tree1的左子树和tree2是否相同,再判断右子树和tree2是否相同原创 2017-06-19 15:29:05 · 170 阅读 · 0 评论 -
面试题17:合并两个排序的链表
/*public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; }}*/public class Solution { public ListNode Merge(ListNode list原创 2017-06-19 14:01:46 · 197 阅读 · 0 评论 -
面试题15:链表中倒数第k个结点
/*public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; }}*/public class Solution { public ListNode FindKthToTail(ListN原创 2017-06-18 21:57:43 · 144 阅读 · 0 评论 -
面试题14:调整数组顺序使奇数位于偶数前面
P104对应代码,基本思想,public class Solution { public void reOrderArray(int [] array) { if(array==null||array.length==0) return; int index1=0; int index2=array.le原创 2017-06-18 20:34:32 · 194 阅读 · 0 评论