自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

NULL

要么做第一个,要么做最好的一个。

  • 博客(67)
  • 资源 (1)
  • 收藏
  • 关注

原创 [Java文件操作] 为文本文件添加行号

【思路】将文件中的内容按行读取存入一个字符串中,在输出时再为每一行加上行号。 1 import java.io.*; 2 public class Text { 3 private String strFinal = ""; 4 public void open(String fileName) { 5 try { 6 Buff

2017-11-20 11:23:28 3612

原创 [剑指Offer] 28.数组中出现次数超过一半的数字

【思路】将每个数字都存入map中作为key值,将它们出现的次数作为value值,当value超过一半时则返回其key值。 1 class Solution 2 { 3 public: 4 int MoreThanHalfNum_Solution(vectorint> numbers) 5 { 6 if(numbers.size() == 1) 7

2017-11-20 11:23:25 210

原创 [剑指Offer] 27.字符串的排列

【思路】从第一位开始,判断每一位字符的所有可能性,依此递归。 1 class Solution 2 { 3 public: 4 void PermutationHelp(vectorstring> &ans, int k, string str) //遍历第k位的所有可能 5 { 6 if(k == str.length() - 1) 7

2017-11-20 11:23:22 201

原创 [剑指Offer] 26.二叉搜索树与双向链表

【思路】因为二叉搜索树的中序遍历就是递增排列的,所以只要在中序遍历时将每个结点放入vector中,再分别为每个结点的左右指针赋值即可。 1 /* 2 struct TreeNode { 3 int val; 4 struct TreeNode *left; 5 struct TreeNode *right; 6 TreeNode(int x) : 7

2017-11-20 11:23:19 151

原创 [剑指Offer] 25.复杂链表的复制

1 /* 2 struct RandomListNode { 3 int label; 4 struct RandomListNode *next, *random; 5 RandomListNode(int x) : 6 label(x), next(NULL), random(NULL) { 7 } 8 }; 9 */ 1

2017-11-20 11:23:16 137

原创 [剑指Offer] 24.二叉树中和为某一值的路径

【思路】 ·递归先序遍历树, 把结点加入路径。 ·若该结点是叶子结点则比较当前路径和是否等于期待和。 ·弹出结点,每一轮递归返回到父结点时,当前路径也应该回退一个结点 注:路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。 1 /* 2 struct TreeNode { 3 int val; 4 struct TreeNode *left; 5

2017-11-20 11:23:11 117

原创 [排序算法] 归并排序

归并排序 【思想】 ·简单地将原始序列划分为两个子序列 ·分别对每个子序列递归排序 ·最后将排好序的子序列合并为一个有序序列,即归并过程 【特点】稳定  空间代价:O(n)  时间代价:O(nlogn) 注: ·尽管归并排序最坏比较次数比快速排序少,但它需要更多地元素移动,因此它在实用中不一定比快速排序快 ·一般二路归并算法需要另外一个存储空间来存储排好序的数组,空间复杂度为O(n) 二路归并算法

2017-11-20 11:23:07 142

原创 [排序算法] 各种排序算法(内排序)的比较及选择依据

各种内排序方法的选择: 1.从时间复杂度选择 对元素个数较多的排序,可以选择快速排序、堆排序、归并排序;元素较少时,可以选择简单的排序方法。 2.从空间复杂度选择 尽量选择空间复杂度为O(1)的排序方法,其次选空间复杂度为O(logn)的快速排序方法,最后才选择空间复杂度为O(n)的二路归并排序方法。 3.一般选择规则 (1)元素个数n大,排序码分布随机,      稳定性不做要求--------

2017-11-20 11:23:04 1474

原创 [排序算法] 基数排序

基数排序 【思想】基数排序属于“分配式排序”,分为高位优先法MSD和低位优先法LSD 低位优先法LSD: ·从最低位k0开始排序 ·对于排好的序列再用次低位k1排序 ·依次重复,直至对最高位kd-1排好序后,整个序列称为有序的 这是一个分、收;分、收;...;分、收的过程 【特点】稳定 空间复杂度:O(dn) 时间复杂度:O(n) 不用比较和移动,采用分配和收集,时间效率高  基数排序有两种存

2017-11-20 11:23:01 1129

原创 [排序算法] 选择排序(2种)

1.直接选择排序 【思想】选出剩下的未排序数据中的最小元素与第i个元素交换 【特点】不稳定  空间代价:O(1)  时间代价:O(n^2) 1 void SelectSort(int Array[], int n) 2 { 3 // 依次选出第i小的记录,即剩余记录中最小的那个 4 for (int i=0; i1; i ++) 5 { 6 /

2017-11-20 11:22:59 189

原创 [排序算法] 交换排序(2种)

1.冒泡排序 【思想】不停地比较相邻的记录,如果不满足排序要求就交换相邻数据,直到所有的记录都已经排好序 【特点】稳定  空间代价:O(1)  时间代价:O(n^2)  -比较次数        -交换次数  ·最少:O(n)      ·最少:0 ·最多:O(n^2)     ·最多:O(n^2) 1 void BubbleSort(int Array[], int n) 2 { 3

2017-11-20 11:22:56 167

原创 [排序算法] 插入排序(3种)

1.直接插入排序 【思想】利用有序表的插入操作进行排序 有序表的插入:将一个记录插入到已排好序的有序表中,从而得到一个新的有序表 【特点】稳定 空间代价:O(1)  时间代价:O(n^2) 1 void InsertSort (int Array[], int n) 2 { 3 //Array[]为待排序数组,n为数组长度 4 int TempRecord; //

2017-11-20 11:22:53 441

原创 [剑指Offer] 23.二叉搜索树的后序遍历

【思路】BST的后序序列的合法序列是,对于一个序列S,最后一个元素是x (也就是根),如果去掉最后一个元素的序列为T,那么T满足:T可以分成两段,前一段(左子树)小于x,后一段(右子树)大于x,且这两段(子树)都是合法的后序序列。下面是在讨论中看到的一份代码,已学习到。 1 class Solution { 2 public: 3 bool VerifySquenceOfBST(v

2017-11-20 11:22:50 142

原创 [BinaryTree] 二叉搜索树(二叉查找树、二叉排序树)

二叉查找树(BinarySearch Tree,也叫二叉搜索树,或称二叉排序树BinarySort Tree)或者是一棵空树,或者是具有下列性质的二叉树: (1)若它的左子树不为空,则左子树上所有结点的值均小于它的根结点的值; (2)若它的右子树不为空,则右子树上所有结点的值均大于它的根结点的值; (3)它的左、右子树也分别为二叉查找树。 下面是它的几个重要函数: 插入结点: 【思路1】递归 终止

2017-11-20 11:22:45 249

原创 [剑指Offer] 22.从上往下打印二叉树

【思路】广度优先遍历,队列实现 1 class Solution 2 { 3 public: 4 vectorint> PrintFromTopToBottom(TreeNode* root) 5 { 6 queue Queue; 7 vectorint> res; 8 if(root == NULL) 9

2017-11-20 11:22:42 165

原创 [剑指Offer] 21.栈的压入、弹出序列

题目描述 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的) 1 class Solution 2 { 3 public: 4 boo

2017-11-20 11:22:39 120

原创 [剑指Offer] 20.包含min函数的栈

题目描述 定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数。 【思路1】两个栈Stack和Min,Stack为当前栈中元素,Min为与Stack中元素一一对应的当前栈最小值。 1 class Solution 2 { 3 public: 4 stackint> Stack; 5 stackint> Min; 6 void push(int

2017-11-20 11:22:36 114

原创 [剑指Offer] 19.顺时针打印矩阵

【思路】本题关键在于 右->左 和 下->上 两个循环体中的判断条件,即判断是否重复打印。 1 class Solution 2 { 3 public: 4 vectorint> printMatrix(vectorint> > matrix) 5 { 6 int col = matrix[0].size(); 7 int row =

2017-11-20 11:22:33 133

原创 [算法] 二维数组(长宽相等)逆时针旋转90°算法

【思路】要完成旋转共需两步 1.第一次x,y互换 s1[i][j]=s[j][i]1,   2,  3,  45,   6,  7,  89,  10,11,1213,14,15,16变成了1, 5, 9, 132, 6,10,143, 7,11,154, 8,12,16 然后x逆序 s2[i][j]=s1[n-i][j]变成了4, 8,12,163, 7,11,152, 6,10,141, 5

2017-11-20 11:22:28 1067

原创 [剑指Offer] 18.二叉树的镜像

题目描述 操作给定的二叉树,将其变换为源二叉树的镜像。  输入描述: 8 / \ 6 10 / \ / \ 5 7 9 11 镜像二叉树 8 / \ 10 6 / \ / \ 11 9 7 5 【思路1】递归,左右孩子交换再

2017-11-20 11:22:26 125

原创 [剑指Offer] 17.树的子结构

题目描述 输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构) 【思路】要查找树A中是否存在和树B结构一样的子树,可以分成两步:  1.第一步在树A中找到和B的根节点的值一样的结点R;即当前树A包含子树B,HasSubtree(...)  2.第二步再判断树A中以R为根结点的子树是不是包含和树B一样的结构。即当前树A是否是子树B,IsSubtree(...)

2017-11-20 11:22:23 85

原创 [剑指Offer] 16.合并两个排序链表

题目描述 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。 【思路1】递归 1 /* 2 struct ListNode { 3 int val; 4 struct ListNode *next; 5 ListNode(int x) : 6 val(x), next(NULL) { 7

2017-11-20 11:22:20 127

原创 [剑指Offer] 15.反转链表

题目描述 输入一个链表,反转链表后,输出链表的所有元素。 【思路1】三个指针在链表上同时滑动。 1 /* 2 struct ListNode { 3 int val; 4 struct ListNode *next; 5 ListNode(int x) : 6 val(x), next(NULL) { 7 } 8 };*/

2017-11-20 11:22:17 96

原创 [剑指Offer] 14.链表中倒数第k个结点

【思路】利用两个相隔为k-1个结点的指针进行遍历,当后一个指针移到末尾时,前一个指针就是要求的结点。 1 /* 2 struct ListNode { 3 int val; 4 struct ListNode *next; 5 ListNode(int x) : 6 val(x), next(NULL) { 7 } 8 };

2017-11-20 11:22:15 91

原创 [剑指Offer] 13.调整数组顺序使奇数位于偶数前面

题目描述 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。 【思路1】用2n的空间换取n的时间复杂度,另外开一个数组,先将奇数存入再将偶数存入 1 class Solution { 2 public: 3 void reOrderArray(vectorint

2017-11-20 11:22:12 76

原创 [剑指Offer] 12.数值的整数次方

【思路1】递归 1 class Solution { 2 public: 3 double Power(double base, int exponent) { 4 if(exponent 0){ 5 base = 1/base; 6 exponent = -exponent; 7 } 8

2017-11-20 11:22:09 105

原创 [剑指Offer] 11.二进制中1的个数

【思路】如果一个整数不为0,那么这个整数至少有一位是1。如果我们把这个整数减1,那么原来处在整数最右边的1就会变为0,原来在1后面的所有的0都会变成1(如果最右边的1后面还有0的话)。其余所有位将不会受到影响。 举个例子:一个二进制数1100,从右边数起第三位是处于最右边的一个1。减去1后,第三位变成0,它后面的两位0变成了1,而前面的1保持不变,因此得到的结果是1011.我们发现减1的结果是把最

2017-11-20 11:22:05 109

原创 [剑指Offer] 10.矩形覆盖

题目描述 我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法? 【思路】可归纳得出结论: f(n) = f(n-1) + f(n-2), (n > 2)。 另外: (1)1 * 3方块 覆 盖3*n区域:f(n) = f(n-1) + f(n - 3), (n > 3) (2)1 * 4方块 覆 盖4*n区域:f(n)

2017-11-20 11:22:02 120

原创 [剑指Offer] 9.变态跳台阶

题目描述 一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。 【思路1】每个台阶都有跳与不跳两种可能性(最后一个台阶除外),最后一个台阶必须跳。所以共用2^(n-1)中情况。 1 class Solution { 2 public: 3 int jumpFloorII(int number) { 4 return

2017-11-20 11:21:59 103

原创 [剑指Offer] 8.跳台阶

题目描述 一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。 【思路】与斐波那契数列类似 1 class Solution { 2 public: 3 int jumpFloor(int number) { 4 int res[100] = {0}; 5 res[0] = 1; 6 res

2017-11-20 11:21:56 92

原创 [剑指Offer] 7.斐波那契数列

1 class Solution { 2 public: 3 int Fibonacci(int n) { 4 int res[40] = {0}; 5 res[0] = 1; 6 res[1] = 1; 7 for(int i = 2;i ){ 8 res[i] = res[i - 1]

2017-11-20 11:21:54 103

原创 [剑指Offer] 6.旋转数组的最小数字(二分法)

题目描述 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。 【思路1】直接调用快排~~~ 1 class Solution { 2 public: 3 int min

2017-11-20 11:21:51 304

原创 [剑指Offer] 5.用两个栈实现队列

题目描述 用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。 【思路】push:直接压入栈A即可     pop:当栈B为空,则把栈A依次出栈并压入栈B,最后对栈B出栈;否则直接对栈B出栈即可。 1 class Solution 2 { 3 public: 4 void push(int node) { 5 stack1.pus

2017-11-20 11:21:48 118

原创 [剑指Offer] 4.重建二叉树

题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。 【思路】递归,先找到根结点,再找到左右子树的前序与中序序列进行递归 1 /** 2 * Definition for binary tree

2017-11-20 11:21:45 108

原创 [剑指Offer] 3.从尾到头打印链表

题目描述 输入一个链表,从尾到头打印链表每个节点的值。 【思路】用一个vector存储,遍历链表时每次从前面插入 1 /** 2 * struct ListNode { 3 * int val; 4 * struct ListNode *next; 5 * ListNode(int x) : 6 * val(x),

2017-11-20 11:21:43 95

原创 [剑指Offer] 2.替换空格

题目描述 请实现一个函数,将一个字符串中的空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。   【思路1】一旦找到空格则将空格后的字符串整体后移两位,然后将%20插入空格处 1 //length为牛客系统规定字符串输出的最大长度,固定为一个常数 2 class Solution { 3 public: 4

2017-11-20 11:21:40 113

原创 [剑指Offer] 1.二维数组中的查找

题目描述 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。 【思路1】双重遍历,查找,相等则返回。 1 class Solution { 2 public: 3 bool Find(int target, vectorint> > array) { 4

2017-11-20 11:21:37 142

原创 [Java] Java常见错误

1.处理java错误"编码 GBK 的不可映射字符" (1)首先记事本打开java源文件 (2)然后另存为,选择ANSI编码 (3)覆盖 (4)再试一下,ok,编译通过。

2017-11-20 11:21:32 314

原创 [Java] Thread的start()和run()函数区别

1.start()方法来启动线程,真正实现了多线程运行,这时无需等待run方法体代码执行完毕而直接继续执行下面的代码: 通过调用Thread类的start()方法来启动一个线程,这时此线程是处于就绪状态,并没有运行。然后通过此Thread类调用方法run()来完成其运行操作的,这里方法run()称为线程体,它包含了要执行的这个线程的内容,Run方法运行结束,此线程终止,而CPU再运行其它线程。 2

2017-11-20 11:21:30 235

原创 [Java] 为什么要定义接口

摘自:https://www.douban.com/note/61810488/ 通俗的讲,就是为了降低耦合度。 一个很搞笑的例子: 看看下面的程序: 一个学校里边,有两种人:学生、老师。他们都要吃饭和睡觉。 ------------------------------ public interface 人{     void 吃饭();    void 睡觉(); } public class

2017-11-20 11:21:27 5956 8

MyCalculator

MFC和VC编写的计算器源代码,可以实现+-*/以及平方,开方,退位,清零功能

2015-07-03

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除