自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(27)
  • 收藏
  • 关注

原创 最大连续子数组和

题目输入一个整形数组,数组里有正数也有负数。数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。 求所有子数组的和的最大值,要求时间复杂度为O(n)。例如输入的数组为1, -2, 3, 10, -4, 7, 2, -5,和最大的子数组为3, 10, -4, 7, 2, 因此输出为该子数组的和18。分析第一个想法肯定就是如果能够把数组的所有子数组之和给列出来,那么就可以很容易的找到最大子数

2015-06-03 21:17:40 374

原创 寻找和为定值的两个数

题目输入一个数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字。要求时间复杂度是O(N)。如果有多对数字的和等于输入的数字,输出任意一对即可。例如输入数组1、2、4、7、11、15和数字15。由于4+11=15,因此输出4和11。暴力法直接穷举,从数组中任意选取两个数,判定它们的和是否为输入的那个数字。此举复杂度为O(N^2)。#include<iostream>using na

2015-05-26 19:28:14 330

原创 求两个升序序列的和中最小的k个数

题目有两个序列A和B,A=(a1,a2,…,ak),B=(b1,b2,…,bk),A和B都按升序排列。对于1<=i,j<=k,求k个最小的(ai+bj)。要求算法尽量高效。分析我们可以使用快速排序或堆排序将相加后的数组进行排序,然后取出最小的k个数即可,但是这样的话,题目中有一个条件没有用到,那就是序列A和序列B都是有序的。如果用上这个条件是不是有更高效的方法呢? 由于序列A和B都是按升序排列,

2015-05-21 15:22:34 867

原创 寻找最小的 k 个数

题目输入n个整数,输出其中最小的k个。 思路一使用排序的方法来解决该问题。快速排序所费时间复杂度为O(n*logn).排序完成过后,只需要取前k个数值即是最小的k个数。int array[] = {34, 9, 27, 36, 80, 12, 5, 100};const int length = sizeof(array)/sizeof(array[0]);void PrintArray(int

2015-05-12 15:26:43 414

原创 吞吐量 带宽与数据传输率的区别

带宽: Max net bitrate,是指链路上每秒所能传送的比特数,它取决于链路时钟速率和信道编码在计算机网络中又称为线速。我们可以说以太网的带宽是10Mbps。吞吐量:throughput, 吞吐量是指在没有帧丢失的情况下,设备能够接受并转发的最大数据速率。 是指实际链路中每秒所能传送的比特数。数据传输率: 香农定理指出:在有随机热噪声的信道上传输数据信号时,数据传输速率Rmax与信道带宽B

2015-05-11 22:04:02 6908

原创 交换排序—快速排序(Quick Sort)

基本思想通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行分割,直到所有的数据都呈有序排列为止。其基本思路如下图所示:具体过程在具体进行排序的时候,我们首先需要找到一个基准值,一般都是选择第一个数作为基准值:有了基准值过后,首先与最后一个数据进行比较,若大于最后一个数据,则互换位置,否则位置保持不变,继续与倒数第二

2015-05-11 21:20:42 412

原创 选择排序—堆排序(Heap Sort)

堆的定义 具有n个元素的序列(k1,k2,…,kn),当且仅当满足 时称之为堆。由堆的定义可以看出,堆顶元素(即第一个元素)必为最小项(小顶堆)。 若以一维数组存储一个堆,则堆对应一棵完全二叉树,且所有非叶结点的值均不大于(或不小于)其子女的值,根结点(堆顶元素)的值是最小(或最大)的。如: 大顶堆序列:(96, 83,27,38,11,09) 小顶堆序列:(

2015-05-11 17:23:36 573

原创 后缀数组

定义子串:字符串S的子串r[i..j],i≤j,表示r串中从i到j这一段,也就是顺次排列r[i],r[i+1],…,r[j]形成的字符串。后缀:后缀是指从某个位置i开始到整个串末尾结束的一个特殊子串。字符串r的从第i个字符开始的后缀表示为Suffix(i),也就是Suffix(i)=r[i..len(r)]。后缀数组:后缀数组SA是一个一维数组,它保存1..n的某个排列SA[1],SA[2],……,

2015-05-07 20:46:20 339

原创 五笔编码

五笔编码五笔的编码范围是a ~ y的25个字母,从1位到4位的编码,如果我们把五笔的编码按字典序排序,形成一个数组如下: a, aa, aaa, aaaa, aaab, aaac, … …, b, ba, baa, baaa, baab, baac … …, yyyw, yyyx, yyyy 其中a的Index为0,aa的Index为1,aaa的Index为2,以此类推。编写一个函数,输入是任意一个

2015-05-06 16:21:12 563

原创 字符串的匹配

题目在一篇英文文章中查找指定的人名,人名使用二十六个英文字母(可以是大写或小写)、空格以及两个通配符组成(?),通配符 “ * ” 表示零个或多个任意字母,通配符“?”表示一个任意字母。如:“J* Smi??” 可以匹配“John Smith” .分析 假设文章内容使用pText指针表示,通配符字符串使用pName指针表示,要完成这样的匹配任务,是需要一个一个字符开始去匹配的:

2015-05-06 14:30:33 421

原创 在字符串中删除特定的字符

题目输入两个字符串,从第一字符串中删除第二个字符串中所有的字符。例如,输入”They are students.”和”aeiou”,则删除之后的第一个字符串变成”Thy r stdnts.”。分析 假设”They are students.”为str1, ”aeiou”为str2,我们需要判断str1中的每一个字符是否在str2中,若在str2中,则删除该字符并且后面的字符往前移一位。那么如何判

2015-05-05 23:19:49 1117

原创 在O(1)时间内删除单链表结点

题目给定单链表的一个结点的指针,同时该结点不是尾结点,此外没有指向其它任何结点的指针,请在O(1)时间内删除该结点。思路 既然一个节点已经给定,那么可以从头结点开始遍历,遍历到给定节点p的前一个节点,然后执行删除操作即可,但是这种方法的时间复杂度为O(n)不符合条件; 我们已知节点指针p,也可以知道下一个节点的指针p->next,那么如果我们将下一个指针值赋给该指针,同时删除下一个指针

2015-05-05 21:51:06 561

原创 链表追赶问题

第一节:求链表倒数第k个节点的值题目:输入一个单向链表,输出该链表中倒数第k个结点,链表的倒数第0个结点为链表的尾指针 分析:首先这个链表时单向链表,并且我们也不知道链表的长度,那么仅仅凭借一个指针来找到倒数第k个节点,就需要知道链表的长度,因此需要先遍历整个链表,得到链表的长度过后,然后再从头结点开始寻找,这种方法显然很笨,那么我们可以用比较简单的方法吗?答案是肯定的,若当一个指针直到最后一个

2015-05-05 21:19:11 343

原创 栈---回文判断

问题判断一个栈是不是“回文”。回文,英文palindrome,指顺着读和反过来读都一样。分析由栈的数据结构可知,栈是一个先进后出的数据结构,因此为了判断该栈是否是一个回文栈,我们可以将栈的一半弹出来,压入另外一个栈,然后再进行判断他们对于数据是否相同即可。当栈的长度为偶数时: 我们只需要弹出一半的数据,然后可直接进行比较。当栈的长度为奇数时,我们需要弹出一半的长度,然后在比较前需要将最中间的一

2015-05-04 21:33:08 731

原创 链表回文判断

问题判断一条单向链表是不是“回文” ?回文,英文palindrome,指顺着读和反过来读都一样。思路1判断回文单向链表跟判断回文字符串很大的区别就是遍历。字符串可以自由向前遍历,而单向字符串不行,因此最简单直观的思路就是将链表翻转,然后再进行比较。但是这种方法就比较笨,因为还需要创建另外一个单链表来存储原有的单链表,然后翻转单链表,然后再进行比较。所以不推荐使用这种方法。思路2既然回文单链表有如此特

2015-05-04 21:29:02 393

原创 回文判断

问题回文,英文palindrome,指一个顺着读和反过来读都一样的字符串,比如madam、我爱我,这样的短句在智力性、趣味性和艺术性上都颇有特色,中国历史上还有很多有趣的回文诗。那么如何判断一个字串是否是回文?思路1既然回文字符串有正过来和反过来读都一样的特性,那么我们可以考虑将字符串翻转,然后再与原字符串相比较,这种思路是最显而易见的。这种思路的时间复杂度和空间复杂度都为O(n):void Rev

2015-05-04 21:27:45 425

原创 字符串全排列

问题输入一个字符串,打印出该字符串中字符的所有排列。例如输入字符串abc,则输出由字符a、b、c 所能排列出来的所有字符串 abc、acb、bac、bca、cab 和 cba。思路假设要排列的字符为abc,那么由这些字符组成的排列可以使用以下方法:首先固定首字母为a,那么只需要对余下字符bc进行排序即可,若再固定b那么得出的排列为abc,若固定字母c,则得出的排列为acb;再固定字符b,那么只

2015-05-04 21:06:43 566

原创 数组越界问题——危险

C++中数组越界问题运行环境本次程序的运行环境是C-Free 5.0.今天写程序,想要实现判断一个字符串是否是回文字符串的问题,代码如下:void Reverse(char *str, int from, int to){ if(NULL == str) return ; while(from < to){ char temp = str[from];

2015-04-23 19:48:52 1092

原创 变位词

变位词 如果两个字符串的字符一样,但是顺序不一样,被认为是兄弟字符串,比如bad和adb即为兄弟字符串,现提供一个字符串,如何在字典中迅速找到它的兄弟字符串,请描述数据结构和查询过程。思路我们需要保存字符串A,然后在字符串B中逐个轮询字符是否存在于字符串A中,若字符全部存在于字符串A中,则记为B 属于 A; 然后再在字符串A中逐个轮询字符是否存在于字符串B中,若所有字符均存在于字符串B中,则记为A

2015-04-22 18:00:02 447

原创 字符串包含

问题*给定两个分别由字母组成的字符串A和字符串B,字符串B的长度比字符串A短。请问,如何最快地判断字符串B中所有字母是否都在字符串A里?为了简单起见,我们规定输入的字符串只包含大写英文字母,请实现函数bool StringContains(string &A, string &B)比如,如果是下面两个字符串:String 1:ABCDString 2:BAD答案是true,即String2里的字母在

2015-04-22 17:36:37 355

原创 单词翻转

问题 单词翻转。输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变,句子中单词以空格符隔开。为简单起见,标点符号和普通字母一样处理。例如,输入“I am a student.”,则输出“student. a am I”。解题思路:先对整体进行翻转,再以空格或者’\0’为界,将语句划分为N个独立的单词,对每个单词进行独立的翻转。先对整体翻转过后得句子:“I am a student.”-

2015-04-21 16:00:22 272

原创 链表翻转

问题 链表翻转。给出一个链表和一个数k,比如,链表为1→2→3→4→5→6,k=2,则翻转后2→1→6→5→4→3,若k=3,翻转后3→2→1→6→5→4,若k=4,翻转后4→3→2→1→6→5,用程序实现。 在之前我们肯定都写过链表的翻转程序:NodePtr ReverseList(NodePtr head){cout << "reverse list" << endl;//若只有头或者只

2015-04-20 22:17:33 689

原创 旋转字符串问题

问题 给定一个字符串,要求把字符串前面的若干个字符移动到字符串的尾部,如把字符串“abcdef”前面的2个字符’a’和’b’移动到字符串的尾部,使得原字符串变成字符串“cdefab”。请写一个函数完成此功能,要求对长度为n的字符串操作的时间复杂度为 O(n),空间复杂度为 O(1)。刚开始遇到这个问题,很自然的就是想要使用一个char一个char的移动方法,也就是简称为暴力法,代码如下:#incl

2015-04-20 17:33:13 467

原创 指针传递遇到的问题--内存角度分析

今天在写字符串旋转问题的代码时遇到了一个问题,纠结了很长时间,刚开始由于对C++语法的不熟悉,所以很长时间没有调试错误来,后来通过分析内存,才发现问题,刚开始的代码如下:#include<iostream>using namespace std;void LeftShiftOne(char* ptr, int n){ char temp = ptr[0]; for(int i=1;

2015-04-20 17:06:08 321

转载 彻底理解链表中为何使用二级指针或者一级指针的引用

在用c/c++写数据结构程序时,链表和二叉树中经常需要用到二级指针或者一级指针的引用,那么什么时候用什么时候不用呢? 先看一个简单的c++链表操作程序: #include "stdio.h" #include "stdlib.h" #include "time.h" #define OK 1 #define ERROR 0 #define TRUE 1

2015-04-05 11:01:45 8551 3

原创 求子数 组的最大和

题目:输入一个整形数组, 数组里有正数也有负数。 数组中连续的一个或多个整数组成一个子数组, 每个子数组都有一个和。 求所有子数组的和的最大值。 要求时间复杂度为 O(n) 解题思路: 1、首先必须从第一个非负数的数字开始计算子数组最大之和 2、从第一个非负数开始将累加,直到碰到下一个负数为止,我们需要记录这个累加之和,将其赋给tempSum 1)将该tempSum与Sum值比较,

2015-04-04 21:04:50 430

原创 定义栈的数据结构, 要求添加一个 min 函数, 能够得到栈的最小元素。 要求函数 min、 push 以及 pop 的时间复杂度都是 O(1)

这是google公司的一道面试题,如果是对各大公司的面试题感兴趣的同学,可以关注一下july的博客: http://blog.csdn.net/v_july_v?viewmode=contents思路:刚开始解这道题目的时候,感觉不是很难,只需在栈的数据结构中加一个选项min就OK了,这样就可以记录最小值。但是这个思路有一个硬伤,那就是第一次调用min函数时,是可以直接获取到最小值,但是如果调

2015-04-04 11:22:49 2100

空空如也

空空如也

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

TA关注的人

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