
面试题目杂集
lycommand
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
在字符串中删除特定子串,并添加上制定串
比如给定字符串,abc123x123x123,我们要删除里面的123子串,并替换成4567串代码如下第一种方法直接利用STL中string的find和insert方法,第二种是原始的遍历建立辅助数组#include #include using namespace std;void DeleteTheSpecialStringOne(string str,string delSt原创 2015-10-17 22:37:14 · 572 阅读 · 0 评论 -
未排序数组中累加和小于给定值的最长子数组长度
本体和本博客里另外一个文章,累加和等于给定值的最长子数组,非常类似,但是上一个题目来说,为了节省时间,使用了哈希表,但是那个题目是,等于,所以哈希表里有,就直接拿,没有,就跳过了,但是本题目是要求,小于或者等于,没办法直接查找,难道要遍历哈希表吗,这样时间复杂度又上去了,所以这里给出了一个新的数组,用作辅助 一定要找到他俩的共同点,都是求所有的以a【i】为结尾的数组中,累加和小于给定值的转载 2016-01-21 23:40:57 · 1575 阅读 · 0 评论 -
自然数组的排序
题目描述: 给定一个长度为N的数组,其中有N个互相不等的自然数,1-N,请实现排序,不要把数组依次赋值为1-N 要求时间复杂度O(n),空间复杂度O(1) 分析: 有数组{1,2,5,3,4} 两个办法 1 遍历到1,2时候,是没问题的,遍历到5的时候,发现3位置竟然不是3,是5,于是我们就找位置为5的元素,发现是4,于是就把5付给4,这样呢,5位置就是正转载 2016-01-22 01:00:38 · 879 阅读 · 0 评论 -
最大子矩阵
意思很简单,求矩阵里的最大子矩阵 比如 -90 48 78 64 -40 64 -81 -7 66最大子矩阵就是第二列 第三列,和为209我们可以根据数组中求最大和的方法,从左到右遍历,找累加和,如果累加和小于0,则sum归于0,然后重新累加,并且维持一个max这个矩阵也是,双重循环,进行矩阵遍历,并且建立辅助累加和数组,数组中求转载 2016-01-22 22:09:41 · 377 阅读 · 0 评论 -
数组中子数组的最大累乘积
这个思路其实和计算数组的大于k的最长子数组长度一样的,先求的所有以a[i]为结尾的最大累乘积的子数组,a【i】从a[0]变化到a[N-1] 在分析以a【i】为结尾的子数组时候,有三种情况 比如数组 3 4 5,a【i】为5,这时候,a[i]前面的子数组中的最大累乘积,12,乘以5,也就是60,所以这是max*a[i] 如果是数组 -3 4 -5,a[i]为-5,这时候,-3*转载 2016-01-23 15:30:51 · 1022 阅读 · 0 评论 -
数组的区间调整
给定一个数组,比如{1,2,2,2,3,3,4,5,6,6,7,7,8,8,8,9};要求进行区间调整,该数组为有序数组,令左半部分为增序,右半部分可以无序比如这个数组,排序后左半部分就是 1 2 3 4 5 6 7 8 9,右半部分则是否增序无所谓。 思路: 设置两个变量 u 和i u初始为0 i初始为1 我们假定a【0】到a【u】为左半区间,a【u+1】到a【i】转载 2016-01-23 19:38:13 · 1055 阅读 · 0 评论 -
N!结尾0的个数
求末尾0的个数:至于末尾有多少个0,这个简单,0的个数为(其中的“/”是取整除法):例子:(1000的阶乘末尾0的个数) 1000 / 5 + 1000 / 25 + 1000 / 125 + 1000 / 625 = 200 + 40 + 8 + 1 =转载 2016-01-24 12:24:45 · 625 阅读 · 0 评论 -
两个栈模拟队列
删除元素: stack2为空,这时候,元素都压入了栈1,我们要删除元素,肯定是删除栈底的元素,这时候把1的元素全部压入栈2,然后2的顶部就是1的栈底,然后我们就可以移除栈2顶部元素了 如果stack2不为空,则直接删除栈顶元素插入元素: 元素直接插入栈1即可#include #include using namespace std;template c转载 2016-01-28 15:48:39 · 363 阅读 · 0 评论 -
寻找旋转有序数组的最小值
#include using namespace std;int a[]={3,4,5,0,2};//原数组为0 2 3 4 5,旋转后就成了这个int Partition(int start,int end){ swap(a[7],a[end]); int i; int record=a[end]; int leftregion=start; for(i=start;i<end转载 2016-01-29 14:25:19 · 547 阅读 · 0 评论 -
数值的整数次方
计算的时候,如果指数是负数,则先计算他的正数,然后求结果,再最后求这个结果的倒数,就是最终答案考虑一个特殊情况,那就是如果底数是0,指数是负数,这样按照上面办法的话,最后一步,分母会变成0,这样是非法的代码如下#include using namespace std;bool gInvalid=false;double PowWithUnsignedExponent(double转载 2016-02-14 23:33:38 · 351 阅读 · 0 评论 -
打印1到最大的n位数
#include using namespace std;#define MAXSIZE 10010 char arr[MAXSIZE]; bool Increse(int n) { int i; bool overflow=false; bool takeover=false; for(i=n-1;i>=0;i--) { int num=arr转载 2016-02-17 12:11:45 · 403 阅读 · 0 评论 -
合并两个顺序链表
使用递归#include using namespace std;typedef struct _Node{ int data; struct _Node *next;}Node,*PNode;PNode BuildList(){ int data; int i=0; PNode head,p,pfront; cin>>data; w转载 2016-02-17 15:55:08 · 520 阅读 · 0 评论 -
全是正数的数组中找和等于给定值的最长子数组
这个题来自于左程云老师的书本p354,但是讲的并不是很透彻,现在这里试着分析如下转载 2016-01-19 12:07:29 · 552 阅读 · 0 评论 -
不重复打印排序数组中相加和为给定值的所有二元三元组
给定排序数组array和给定值k,不重复打印array中累加和为k的不降序二元与三元组, 比如给定array={-8,-4,-3,0,1,2,4,5,8,9},k=10,打印结果为 1 9 2 8 思路如下: 使用两个指针,left指向最左边的节点,right指向最右边的节点,然后我们不断的向中间压缩,打印 如果array[left]+array[r转载 2016-01-18 21:53:23 · 592 阅读 · 0 评论 -
二维矩阵(杨氏矩阵)查找
定义: 从左到右,从上到下,依次增大查找某元素假设矩阵为 1 2 8 9 2 4 9 12 4 7 10 13 6 8 11 15 在里面查找7,如果我们从1转载 2016-01-18 17:43:26 · 669 阅读 · 0 评论 -
组合问题-----从字母表中选择n个字母
这是绿盟考试的一道题,意思是让我们从26个字母中选取n个字母,组成一个子串比如,选取4个,就是abcd,abce,abcf,abcg······等思路采取dfs深搜#include using namespace std;char alphabet[]={'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p',原创 2015-10-16 20:53:04 · 957 阅读 · 0 评论 -
字符串的统计字符串
给定一个字符串,统计每一个字母的出现次数比如aabbccc,打印出来就是a_2_b_2_c_3思路还是采取遍历,注意这几个题的思路都比较类似要注意这里的sstream 这里的clear()并非清空了缓冲区,而只是重置标志,如果要重置缓冲区,则应为ss.str(“”)#include #include using namespace std;void CalNumberOfLe原创 2015-10-18 10:11:42 · 566 阅读 · 0 评论 -
统计一个字符串中每个字母是否只出现了一次
因为字符的范围是0-255 所以建立一个长度为256的布尔数组,每次遍历都把相应位置设置为true,如果在某次遍历时候,相应位置已经是true,则证明该字母已经出现过了,就返回false。另外还可以STL的map来做,也可以用计数排序来做,建立辅助数组,每次相应位置自增1,最后遍历该辅助数组,如果出现大于1的元素,则返回false第一种解法如下#include #include u转载 2015-10-18 10:23:52 · 595 阅读 · 0 评论 -
在有序但是含有空的字符串中查找最左边特定字符串的位置
比如给定一个字符串数组,“”,“ab”,"ab","","","","xx","yy","zz",查找ab字符串最左边的位置就是1,而不是2。如果要找的字符串是空,或者根本没有找到,就返回-1思路采用二分法,但是这里和普通二分不同,要进行判断设要找的字符串为str,start=0,end等于字符串数组最后一个位置如果当前mid处值等于要找的,这时候传给全局变量Pos,但是这个pos转载 2015-10-18 15:53:23 · 862 阅读 · 0 评论 -
去掉字符串中出现k个0的子串
#include #include using namespace std;void DeleteK0(string a,int num){ int i=0; int ZeroNumber=0; bool b=true,bOK=false; int posBegin=0; for(i=0;i<a.length();i++) { if(a[i]=='0') {原创 2015-10-16 11:17:48 · 606 阅读 · 0 评论 -
反转链表
注意这里反转时候,要把头指针指向的节点的next域设为NULL,才可以从后面往前输出时候能截止。#include #include #include #include #include #include using namespace std;typedef struct _LinkNode{ int data; struct _LinkNode *next;}Lin原创 2015-10-18 22:03:04 · 298 阅读 · 0 评论 -
使用特定字符串代替源字符串中空格
比如使用%20代替源字符串中空格要求O(1)的空间复杂度,所以考虑从后往前移动源字符串#include #include using namespace std;void InsertStrintWithWords(char a[100],int len){ //%20 int i=0; int spaceNumber=0; for(i=0;i<=len;i++) {转载 2015-10-18 20:55:01 · 416 阅读 · 0 评论 -
判断是否是变形字符串
#include #include using namespace std;bool JudgeDeform(){ string a="1236"; string b="2316"; mapmapa; mapmapb; for(int i=0;i<a.length();i++) { mapa[a[i]]++; mapb[b[i]]++; } map:原创 2015-10-15 21:41:34 · 573 阅读 · 0 评论 -
最长可整合子数组
先给出可整合数组的定义: 如果一个数组arr在排序之后,从最小值到最大值的顺序中,每相邻两个数之间差的绝对值都为1,则arr为可整合数组。 例如: arr = {5,3,4,6,2},再排序之后为:{2,3,4,5,6},排序后符合每相邻两个数之间差的绝对值都为1,所以arr是可整合数组。 给定一个整形数组arr,请返回其中长度最大的可整合子数组的长度。[5,0,1,2,4,3,9],最长转载 2016-01-16 12:36:09 · 462 阅读 · 0 评论 -
转换数组使奇数位为奇数 偶数位为偶数
设定 odd even两个标志位为odd为1,even为0,然后从最后一位开始看,如果说最后一位为偶数,就和even位交换,even自增2,如果是奇数,则和odd位交换,odd自增2,一直到二者其中一个越界位置。 解法比较奇特。#include#include #include using namespace std;//改变数组,令其奇数位置存储奇数,偶数位置存储偶数//要求空转载 2016-01-17 13:48:11 · 1241 阅读 · 1 评论 -
需要排序的最短子数组长度
题目很简单,求需要排序的最短子数组长度假设数组为a b c d e f g h i j k l m n如果abc是有序的,mn是有序的,至于中间的defghijkl是无序的,我们可以得知,如果是正常升序序列,左边的一定是小于右边的任意数值,右边的一定大于左边的任意数值。所以我们从后往前遍历,如果某个元素大于右边最小的元素,就标记,一直遍历到最左边从前往后遍历,如果某个元素小于左边转载 2016-01-17 17:07:09 · 1236 阅读 · 0 评论