- 博客(50)
- 资源 (3)
- 问答 (1)
- 收藏
- 关注
原创 【Java基础】Java中的char是否可以存储一个中文字符之理解字符字节以及编码集
Java中的一个char采用的是Unicode编码集,占用两个字节,而一个中文字符也是两个字节,因此Java中的char是可以表示一个中文字符的。 但是在C/C++中由于采用的字符编码集是ASCII,只有一个字节,因此是没办法表示一个中文字符的。解答了上面的浅显易懂的问题之后,下面彻底理清楚字符 字节以及编码的原理。 其实关于编码以及字节的问题,在腾讯实习生一面的时候也问到过,当时搞不懂面试官为
2016-04-28 19:21:28 9575
原创 【剑指offer-Java版】49把字符串转换为整数
字符串转换为整数 : atoi可能的输入: 1 带符号数 2 无符号数 3 零 4 空指针 5 超出表示范围 – 暂时仅仅是直接退出且设置最小 – 可以考虑此时抛个异常 6 非法输入,比如并不是一个0-9或者+ -组成的字符串 – 对于非法输入一律返回的是Integer.MIN_VALUE public class _Q49<T> { public long Str
2016-04-27 09:48:55 2073
原创 【剑指offer-Java版】47不用加减乘除做加法
不用 + - * / 做加法 输入两个整数,不使用四则运算求出这两个数的和 分析加法运算对应的位运算: 1 等价于两个数先做异或运算 – 相当于不考虑进位的加法 2 然后按位与运算并将与运算的和左移一位 – 相当于考虑进位 3 将1中的结果赋值给第一个数,将2中的结果赋值给第二个数 4 如果第二个数不为0,重复1 2 3 public class _Q47<T> {
2016-04-27 09:48:00 745
原创 【剑指offer-Java版】46求 1 + 2 + 3 + ... + n
求 1 + 2 + … + n 但是不能使用判断,循环,分支,条件判断语句以及乘除运算利用反射实现递归:目标就是构建一个递归出口 public class _Q46<T> { public int terminator(int n){ return 0; } public int sum(int n) throws IllegalAccessExcepti
2016-04-27 09:47:16 1635
原创 【剑指offer-Java版】45圆圈中最后剩下的数字
圆圈中最后剩余的数字:约瑟夫环问题 0-n这n个数字排成一圈,从数字零开始每次从这个圆圈中删除第m个数字,求出剩余的最后一个数字 public class _Q45<T> { // 低效的模拟而已 public int LastRemaining(int n, int m){ if(n < 0 || m < 0) return -1; int c
2016-04-27 09:45:59 714
原创 【剑指offer-Java版】44扑克牌的顺子
扑克牌中的顺子:从一副扑克牌中抽取5张,判断是不是一个顺子。 2- 10 为自身,A 为1 JQK为11 12 13,大小王为任意数先按从小到大对5张牌进行排序 首先判断大小王个数K(只能为0 1 2) 然后判断不连续的间隔之和M,比较M和K的大小;如果在遍历的过程中出现了对子,那么就直接退出,不可能再形成顺子 public class _Q44<T> { public boo
2016-04-27 09:44:47 574
原创 【剑指offer-Java版】43n个骰子的点数
属于比较适合进行时空权衡的题目,不过没有过多的研究dp技巧,只是简单的用作者的思路实现了下 public class _Q43<T> { private final static int dice = 6; // 面数 public static void main(String[] args) { PrintDiceProb(2); } //
2016-04-27 09:44:03 633
原创 【剑指offer-Java版】42翻转单词顺序VS左旋转字符串
反转单词顺序以及左旋转字符串:输入一个英文句子,翻转句子中的单词顺序,单词内部的字母顺序是不变的 – I am a student. -> student. am I第一步,翻转句子中的所有字符串,第二步翻转单词顺序 public class _Q42<T> { public char[] ReverseSentence(String str){ if(str == n
2016-04-27 09:43:01 557
原创 【剑指offer-Java版】41和为s的两个数字VS和为s的连续正数序列
和为S的两个数字以及和为S的连续正数序列:输入是一个递增排序的数组,查找其中一对满足和为S的数,输出。如果有多对,输出其中一对 public void FindNumbersWithSum(int nums[], int sum){ if(nums == null) return; int indexL = 0; int indexR = nu
2016-04-27 09:41:49 403
原创 【剑指offer-Java版】40数组中只出现一次的数字
数组中只出现一次的数字:输入一个数组,该数组中有两个数字只出现了一次,其他数字都出现了两次,求出这两个只出现了一次的数字 要求时间复杂度为O(n)空间复杂度为O(1) 考虑一个数组中只有一个数字仅仅出现一次而其他数字都出现了两次,求这个只出现了一次的数字 – 结合异或运算的性质,两个相同数字异或的结果必为0 那么我们只需要依次 将数组中的数据进行异或,最终结果就是那个只出现一次的数字
2016-04-27 09:40:44 659
原创 【剑指offer-Java版】39二叉树的深度
二叉树的深度:递归判断二叉树是否是平衡二叉树:注意二叉树平衡代表的是所有非叶子节点都是一棵平衡树 – 而不仅仅是根节点 public class _Q39<T> { public int TreeDepth(BinaryTreeNode<?> tree){ if(tree == null) return 0; if(tree.leftChild == nu
2016-04-27 09:39:54 355
原创 【剑指offer-Java版】38数字在排序数组中出现的次数
数字在排序数组中出现的次数: 最简单粗暴的方法是O(n^2)可能的解法可以采用二分,首先根据二分找到给定数字在数组中的位置,然后再左右二分,找到边界(第一个和最后一个),左右边界的差值就是出现次数 public class _Q38<T> { public int GetNumberOfK(int nums[], int k){ if(nums == null) re
2016-04-26 16:40:31 415
原创 【剑指offer-Java版】37两个链表的第一个公共结点
两个链表中的第一个公共顶点: 解法一:两次遍历即可 第一次遍历找到两个链表的长度,求出差值k,然后较长的;链表先走k步,之后两个链表同时走,直到遇到第一个相同的结点为止 解法二:辅助栈,先顺序遍历并将链表内容存储到栈中,然后依次弹栈,直到遇到最后一个不同结点 public class _Q37<T> { public ListNode<T> FindFirstCommonNo
2016-04-26 16:39:37 384
原创 【剑指offer-Java版】36数组中的逆序对
数组中的逆序对:归并排序的另类应用数组中的逆序对:给定的数组,如果两个数字中前面一个数字大于后面的一个,那么称为一个逆序对,数组中所有满足此关系的逆序对总数就是这个数组的逆序对此处的实现并不优雅,毕竟copy数组是不需要的,只需要一个局部的就可以 但是如果使用的是一个局部的空间复杂度是logn的辅助数组,会造成代码有一点点难理解另外,书上的明显是错误的代码,没有运行过,但是从逻辑上来分析,应该会出
2016-04-26 16:38:49 830
原创 【剑指offer-Java版】35第一个只出现一次的字符
第一个只出现一次的字符: 对于给定的字符,遍历一遍,然后将其映射到一个hash表中,遍历完成之后,遍历哈希表, 遇到的第一个哈希值为1所对应的字符就是第一个只出现了一次的字符 public class _Q35<T> { public char FirstNotRepeatingChar(char chars[]){ if(chars == null) ret
2016-04-26 16:38:08 458
原创 【剑指offer-Java版】34丑数
丑数:返回第N个丑数只包含因子 2 3 5的数称为丑数,第一个丑数是 1 采用辅助数组的方法,提高时间效率 – 下一个丑数一定是已有的丑数乘以2 或者 3 或者 5 得到的 public class _Q34<T> { public int GetUglyNumber(int count){ if(count < 1) return 0; if(cou
2016-04-26 16:36:33 483
原创 【剑指offer-Java版】33把数组排成最小的数
把数组排成最小的数 难点在于比较规则的确定以及比较规则的正确性证明 比如:仅仅是局部的两个数字的顺序较小,如何保证整个数组按此规则进行排序后达到全局的较小 书中关于这一点的证明直接用的反证法,忘的差不多了 public class _Q33<T> { public void PrintMinNumber(int nums[]){ if(nums == nu
2016-04-26 16:35:49 349
原创 【剑指offer-Java版】31连续子数组的最大和
连续子数组最大和,要求O(n)时间复杂度 思路:核心思想就是当前遍历数组的时候,遇到的是一个正数,计算这个正数加上已有的和得到一个新的和 如果这个新的和比当前的正数大,那么保留该和否者更新和为当前正数 书上173页的动态规划的公式也是适用于本例的 public class _Q31<T> { public int[] FindGreatestSumOfSubArray(int a
2016-04-26 16:33:55 374
原创 【剑指offer-Java版】30最小的K个数
最小的K个数: 思路一:类似于第29题,直接进行Partion,直到返回值未K – 缺点是需要修改输入的数据 思路二:维护一个大顶堆,然后遍历一次给定数组 如果当前堆元素小于K个 那么直接将当前元素加入堆中,并调整堆 如果当前堆中元素等于K个 如果当前遍历数据小于堆顶元素,那么删除堆顶然后将当前元素插入堆,并调整堆 如果当前遍历元素大于堆顶,那么什么也不做 由于建立堆和调整堆的大小的
2016-04-26 16:33:08 627
原创 【剑指offer-Java版】29数组中出现次数超过一半的数字
数组中出现次数超过一半的数字 两种思路: 思路一:由于出现次数超过一半,所以如果对这个数组进行划分之后无论如何,位于数组下标 n/2的数字就是出现次数超过一半的数 所以问题就转换为了求划分一次之后 位于 n/2的数字 – Partion()方法不一定能恰好就找到 n/2的位置,所以需要多次迭代 因此该方法严格来说并不是一种 O(N)复杂度的,而是 O(KN) 其中 K大于等于1小于等于l
2016-04-26 16:31:53 416
原创 【剑指offer-Java版】28字符串的排列
字符串的全排列:全排列问题刚刚做过,而且解决方法不止一种 递归,多想想 public class _Q28<T> { private int count = 0; public void Premutation(char chars[], int begin){ if(chars == null) return; if(chars.length
2016-04-26 11:31:15 587
原创 【剑指offer-Java版】27二叉搜索树与双向链表
二叉排序树转双向链表:又是一个不是很懂的递归,原理很懂,代码很懂,自己写就需要写很久 需要多画画图,多在脑子里面模拟一下递归过程,缺乏此类训练 这个递归练习也是理解Java值传递和引用传递机制的极好分析案例 比如原解法中通过一个引用副本进行传递,但是在递归调用过程中会出现左子树丢失的情形, 但是Java并没有什么可以将对象的引用的修改进行保存的方法,所以就设置了个成员变量-很好的解决了,但
2016-04-26 11:30:06 418
原创 【剑指offer-Java版】26复杂链表的复制
复杂链表复制:一种思路是通过哈希表存放sibling的配对信息 – 没看明白 一种思路是直接在原始链表中复制,然后拆分 – 属于时间和空间效率都比较高的方式 分三步,还是比较好懂的 public class _Q26<T> { public ComplexListNode<T> Clone(ComplexListNode<T> list){ if(list == nu
2016-04-26 11:29:12 612
原创 【剑指offer-Java版】25二叉树中和为某一值的路径
二叉树中值和为某一值的路径:类似图的深度优先遍历对于此类问题一直有点弱,多想几次就OK了–主要是不熟悉,毕竟代码写出来之后一看就明白,但是自己想的时候还是有点困难 public class _Q25 { public void FindPathInTree(BinaryTreeNode<Integer> tree, int expectedSum){ if(tre
2016-04-26 11:27:50 461
原创 【剑指offer-Java版】24二叉搜索树后序遍历序列
二叉搜索树的后续遍历序列:既然是二叉搜索树,那么就满足左子树结点都大于或者小于根节点右子树都小于或大于根结点根据搜索树的这种特点,将给定的树划分为左子树或者右子树,递归的处理左右子树 public class _Q24 { public boolean VerifySeqOfBST(int seq[]){ if(seq == null ) return false;
2016-04-26 11:26:40 330
原创 【剑指offer-Java版】23从上往下打印二叉树
从上往下打印二叉树:如果把这个书看做是一个特殊的图,那么该打印过程就类似于一个广度优先遍历 public class _Q23 { public <T> void PrintTreeFromTopToButtom(BinaryTreeNode<T> root){ if(root == null) return; Queue<BinaryTreeNode<T
2016-04-26 11:25:57 382
原创 【剑指offer-Java版】22栈的压入弹出序列
栈的压入弹出序列:给定两个序列,一个是压入顺序,判断另外一个是否是该压入顺序的一个弹出顺序思路:纯粹的模拟栈的压入和弹出顺序 分别遍历压栈序列seq1和另一个序列seq2 比较当前栈顶元素和seq2的当前值 如果相等,那么弹出,seq2的指针下移 如果不等,那么依次压入seq1中的元素直到遇到栈顶等于当前seq2指针所知元素 如果上述遍历中将seq1中所有数据都压入栈之后,仍未找到seq2
2016-04-26 11:24:41 761 1
原创 【剑指offer-Java版】21包含min函数的栈
包含min操作的栈:在基本栈基础上提供一个Min功能,可以取得当前栈的最小值重点在于思路,拿空间换取了Min的功能,申请一个等量空间的辅助栈用于存取栈中的最小元素 public class _Q21 extends MyStack<Integer> { private MyStack<Integer> dataStack = new MyStack<>(); private
2016-04-26 11:21:29 368
原创 【剑指offer-Java版】20顺时针打印矩阵
顺时针打印矩阵:重在理解,毕竟作者分析的那个方法看起来还是蛮复杂的-所以自己写了个接地气的方法重在逻辑的一个题,一次性完全写对还是比较困难的 public class _Q20 { public void PrintMatrixClockwisely(int matrix[][]){ if(matrix == null) return; int sta
2016-04-26 11:03:08 486
原创 【剑指offer-Java版】19二叉树的镜像
二叉树的镜像: public class _Q19 { public void MirrorRecursively(BinaryTreeNode tree){ if(tree == null) return; if(tree.leftChild == null && tree.rightChild == null) return; Bin
2016-04-26 11:01:46 300
原创 【剑指offer-Java版】18树的子结构
树的子结构:输入两棵二叉树A B,判断B是不是A的子结构就是一个递归加上一个树的先序遍历 public class _Q18 { public boolean HasSubTree(BinaryTreeNode tree1, BinaryTreeNode tree2) { if (tree1 == null) return false; if (tr
2016-04-25 23:06:10 446
原创 【剑指offer-Java版】17合并两个排序链表
合并两个排序链表:老生常谈的内容了 while循环或者递归 注意:输入链表存在一个空或者两个空 public class _Q17 { public ListNode<Integer> Merge(ListNode<Integer> list1, ListNode<Integer> list2){ if(list1 == null) return list2;
2016-04-25 23:05:22 333
原创 【剑指offer-Java版】16反转链表
反转链表:此处为了符合题意就不设置头结点了 思路简单直接,遍历一遍即可需要注意的地方: 输入异常:空或者只有一个结点 public class _Q16 { public ListNode ReverseList(ListNode list){ if(list == null) return null; if(list.next == null) re
2016-04-25 23:04:42 343
原创 【剑指offer-Java版】15链表中倒数第K个结点
链表中倒数第K个结点:快慢指针解决 需要注意的地方是 1) 可能会存在输入的链表大小小于k 2) 输入的k可能小于等于0 - 所以必须限定k大于0 public class _Q15 { public ListNode FindKthToTail(ListNode head, int k){ if(head == null || k < 1) return n
2016-04-25 22:53:17 306
原创 【剑指offer-Java版】14调整数组顺序使奇数位于偶数前面
调整数组顺序使奇数位于偶数前面:遍历交换特殊输入: 1) 只有一个数字 2) 全奇数或者全偶数 3) 空指针 4) 正常输入 考虑到扩展性,C++里面使用了函数指针来实现,但是对于java,可以采用接口实现 - 思路比较简单 public class _Q14 { public void ReorderOddEven(int array[]){ if(ar
2016-04-25 22:52:14 479
原创 【剑指offer-Java版】13O(1)时间删除链表结点
O(1)时间删除链表结点 前提是调用者知道要删除的结点的指针,而不是要删除结点的值 不过此类删除问题,当然是存在各种边界条件了: 1) 链表中只有一个结点 - 删除唯一的一个 2) 要删除的结点是最后一个结点 - 3) 要删除的结点不存在 - 多虑了,毕竟给定的参数是一个结点参数,所以不会存在这种问题,除非调用者故意给定 public class _Q13 { publi
2016-04-25 22:50:10 430
原创 【剑指offer-Java版】12打印1到最大的n位数
打印1到最大的n位数:比较简单了,但是考虑n 很大的时候n位的最大999…9可能会超出表示范围 大数问题-需要使用字符串或者数组模拟大数加法 public class _Q12 { public void PrintFromOneToMaxN(int n){ if(n <= 0) return ; char digit[] = new char[n];
2016-04-25 22:48:40 494
原创 【剑指offer-Java版】11数值的整数次方
不用库,实现pow()运算 很简单的题目,但是涉及到很多细节 比如 1) 结果非法或者出错的时候如何通知调用者: 可以采用返回特定值的方法-但是此处pow运算既可以返回正数 0 或者负数,所以此思路比较麻烦 可以采用全局变量加上返回值的方法-缺点是比较容易忘记检查全局变量的标志 可以直接使用异常机制来实现-就是此处的方法了,虽然异常的缺点在于可能会导致程序执行流程的极大改变,但是比较方
2016-04-25 22:46:54 417
原创 【剑指offer-Java版】10二进制中1的个数
二进制中1的个数: 思路一:循环右移给定的数,但是存在负数出现死循环的问题 思路二:声明一个变量flag并初始化为1,然后循环右移flag,循环次数是和给定数的精度也就是位数有关 思路三:用了二进制一个很有意思的特性:二进制数减少1,那么第一位非零位置会变成0,而该位置右边的零都会变成1。然后将其与原数相与,消除该位右边所有的1(由于减1产生)。循环,直到给定数为0。循环次数就是一个数中1的个
2016-04-25 17:42:02 411
android-ipr-iml
2018-02-14
java中MySQL的环境配置及数据库增删改查模板代码-工具包-工具类JdbcUtils模板代码
2015-08-20
Android NDK编译已有的C++实现的协议库文件--求助
2015-10-12
TA创建的收藏夹 TA关注的收藏夹
TA关注的人