ACM
「已注销」
这个作者很懒,什么都没留下…
展开
-
for循环用效率分析(++和--时效率的差异分析)
(听别人说的面试中问过的一个问题,记不清了,如有偏差希望大家补充纠正) 问题:完成相同的功能,for循环使用++和–哪个效率更高?通常我们在编写需要for循环实现的程序时有两种实现方法:for(int i = 0;i<arr.length;i++)for(int i = arr.length-1;i>=0;i--)分析: 结论:通常来讲第2种用–的方法效率更高 原因如下:原创 2015-11-10 07:56:22 · 4936 阅读 · 1 评论 -
栈的压入、弹出序列
栈的压入、弹出序列 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。 思路:(PS:记住是用一个辅助栈即可) 利用一个辅助栈 依次按压栈顺序压入辅助栈,辅助栈顶即为当原创 2016-01-12 08:11:54 · 492 阅读 · 0 评论 -
连续子数组的最大和
题目:常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)思路:这种题目一般先自己模拟一下各种情况,找出规律,然后code。 思路如下: 1. 如果累加上当前数比当前数本身还小的话,说明之前的和是负的原创 2016-03-02 08:41:01 · 421 阅读 · 0 评论 -
二叉树的深度 (递归与非递归方法整理)
题目描述 输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。解法及思路一、 递归的方法思路: 我们可以从另一个角度来理解树的深度:如果一棵树只有一个结点,那么它的深度为1;如果根结点只有左子树没有右子树,那么树的深度是左子树的深度加1,加1是加上根节点这一层如果既有左子树又有右子树,那么树的深度应该是左、右子树中深度原创 2016-03-05 08:58:27 · 10594 阅读 · 0 评论 -
剑指offer题目记录
剑指offer题目记录1.如下为类型CMyString的声明,请为该类型添加赋值运算符函数。1 class CMyString 2 {3 public:4 CMyString(char* pData = NULL);5 CMyString(const CMyString& str);6 ~CMyString(void);7 private:转载 2016-03-06 08:57:29 · 951 阅读 · 0 评论 -
二叉搜索树的第k个结点
题目: 给定一颗二叉搜索树,请找出其中的第k大的结点(从小到大的第K个)分析: 因为中序遍历二叉搜索树输出二叉树的结果是从小到大,所以我们实现中序遍历,这样打印出来的是从大到小的排序,从而当遍历到第k个节点的时候,停止遍历,并输出,用递归实现,把遍历的点的个数的引用传入函数中 PS:如果题目要求是从大到小实现,那么我们可以采取先遍历右节点再遍历左节点的思想Code:/*str原创 2016-03-08 08:12:08 · 746 阅读 · 0 评论 -
异或运算在算法编程题中的应用
异或运算在算法编程题中的应用一、异或找出只出现一次的数字 思路:任何一个数字,跟自己异或都为0 如果一个数组中,只有一个数字出现一次,而其他数字都是成对出现的话,那么从头到尾将所有数字依次异或的话,最后得到的结果就是这个只出现一次的数字 int A[] = { 5, 5, 3, 3, 4, 8, 8 }; int res = 0; for (int i = 0; i原创 2016-03-08 08:41:52 · 1296 阅读 · 1 评论 -
反转单链表 (三种方法整理)
题目:反转单链表 输入一个链表,反转链表后,输出链表的所有元素。 据找工作的师兄说,反转单链表基本各个公司面试都会有,整理出一些写的比较好的code,供我等小白们学习。简洁,清晰,我觉得写得蛮好的。/*struct ListNode { int val; struct ListNode *next; ListNode(int x) :原创 2015-10-26 21:15:23 · 48930 阅读 · 6 评论 -
“平行算法”求二进制数中1的个数
int func(unsigned int i){ unsigned int temp = i; temp = (temp & 0x55555555) + ((temp>> 1) & 0x55555555); //temp相邻位相加 temp = (temp & 0x33333333) + ((temp >> 2) & 0x33333333); //temp相邻(以原创 2016-03-13 21:40:40 · 3368 阅读 · 2 评论 -
构造回文串(腾讯2014暑期实习生)
题目:给定一个字符串s,你可以从中删除一些字符,使得剩下的串是一个回文串。如何删除才能使得回文串最长呢? 输出需要删除的字符个数。输入描述: 输入数据有多组,每组包含一个字符串s,且保证:1<=s.length<=1000.输出描述: 对于每组数据,输出一个整数,代表最少需要删除的字符个数。输入例子: abcda google输出例子: 2 2解法:利用回文串和最长公共子串(原创 2016-08-05 14:57:37 · 587 阅读 · 0 评论 -
把字符串转换成整数 (用位操作)
把字符串转换成整数问题: 将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。方法一(自己写的直白的方法,抛砖引玉)class Solution {public://char转换成intint CharToInt(char c){ int res; res = c - '0'; if (res<0 || res>9) return 0;原创 2015-12-20 09:58:17 · 810 阅读 · 0 评论 -
常用五大算法详细介绍
简单介绍: 贪心算法:在对问题求解时,总是做出在当前看来是最好的选择,有可能陷入局部最优。 分治:将一个难以直接解决的大问题,分割成一些规模较小的相同问题,以便各个击破,分而治之。 动态规划:将待求解的问题分解为若干个子问题(阶段),按顺序求解子阶段,前一子问题的解,为后一子问题的求解提供了有用的信息。与分治的区别:经分解后得到的子问题往往不是互相独立的(即下一个子阶段的求解是建立转载 2016-08-08 22:35:39 · 1097 阅读 · 0 评论 -
树的子结构
问题:输入两颗二叉树A,B,判断B是不是A的子结构。思考:1.首先需要递归pRoot1树,找到与pRoot2根一样的节点,这需要一个遍历2.找到相同的根节点后,要判断是否子树,仍需要一个一个遍历对比树的遍历我们一般就用递归来做,那么根据分析需要两个递归函数如下:bool IsSubtree(TreeNode*p1, TreeNode *p2){ if (!p2)原创 2016-01-09 09:54:53 · 447 阅读 · 0 评论 -
左旋转字符串 (可能不是你想的那么简单)
左旋转字符串题目:汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”。 方法一:无脑方法,根本不是题目的考察方向 思路: 逐个字符处理,先把n~length,保存在一个串res中,再原创 2015-12-23 07:44:38 · 547 阅读 · 0 评论 -
程序设计中的 短路特性(逻辑运算而已)
今天刷题的的时候,看到讨论里有人用短路特性实现递归终止,觉得好高大上,我是个小白,还请见谅,那么就学习了下什么叫短路特性?短路特性包括(短路现象常见的有) : 短路与(&&)和短路或(||)>若a && b ,如果a 的值为假,则整个表达式的值就为假,它是从左向右计算的。所以执行该表达式后,b 的值还是它的初始值,即不进行运算。 例如:(m=a>b)&&(n=c>d),当a b c d 分别原创 2015-10-26 11:12:16 · 1338 阅读 · 0 评论 -
深入探讨 如何高效找素数
找素数是编程题中比较基础的一个题目,但要深入研究,其中还有很多门道,下面就稍微深入的研究一下: 最常规的方法 只是不从2-n,而简化成从2-sqrt(n),减少计算量,代码如下 bool is_prime(int n) { if(n1) return false; for(int i = 2;i原创 2015-10-22 09:54:42 · 609 阅读 · 0 评论 -
VS2013等版本中怎么写函数注释可以鼠标悬停自动显示
项目里代码多了,鼠标一指哪个函数就能有注释是比较方便的,但是我写了半天注释,鼠标怎么点也不自动显示,就查了下写在这里给需要的人参考下。方法如下: 注释要写在函数实现的地方,才可以自动显示(我都是写在声明里了。。。。。)注释的格式如下: //注释 void test(xxx) 就是注释写在函数上边即可。 小白互相学习进步!原创 2015-11-15 10:26:52 · 6400 阅读 · 0 评论 -
数字在排序数组中出现的次数 (递进的方法整理)
问题: 统计一个数字在排序数组中出现的次数 方法一 思路:最直白简单无脑的解法:从头遍历一遍数组,等于k时,count++ class Solution {public: int GetNumberOfK(vector<int> data ,int k) { int count = 0; for(int i = 0;i<data.原创 2015-10-29 09:02:05 · 556 阅读 · 0 评论 -
(经典的异或技巧)数组中只出现一次的数字 (两种方法)
数组中只出现一次的数字 一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。 方法一: 采用异或运算 (算是标准的思路吧) 思路: 此题考察的是异或运算的特点:即两个相同的数异或结果为0。 此题用了两次异或运算特点: (1)第一次使用异或运算,得到了两个只出现一次的数相异或的结果。 (2)因为两个只出现一次的数肯定不同,即原创 2015-10-27 10:38:21 · 6833 阅读 · 0 评论 -
最小的K个数 (冒泡和最小堆)
问题:最小的K个数 输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。 - 方法一(冒泡排序k趟) 思路:冒泡排序进行k趟即可,就把最小的k个跳出来了class Solution {public: vector<int> GetLeastNumbers_Solution(vector<int> inp原创 2015-10-31 08:54:05 · 631 阅读 · 0 评论 -
两个链表的第一个公共结点
两个链表的第一个公共结点 问题:输入两个链表,找出它们的第一个公共结点。方法一 思路:常规想法:找出2个链表的长度,然后让长的先走两个链表的长度差,然后再一起走(因为2个链表用公共的尾部)这是我我自己写的code/*struct ListNode { int val; struct ListNode *next; ListNode(int x) :原创 2015-11-02 08:44:46 · 461 阅读 · 0 评论 -
数组中出现次数超过一半的数字
问题:数组中出现次数超过一半的数字 题目描述:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。 方法一 思路:直白的想法,先排序,然后判断前一半的数,看其中有没有一个数k,等于他后边half位置之后的数,有则返回数k,无则返回0原创 2015-11-01 08:53:59 · 494 阅读 · 0 评论 -
c++变量的存储区域
c++变量的存储区域栈区(stack)— 由编译器自动分配释放 ,存放为运行函数而分配的局部变量、函数参数、返回数据、返回地址等。堆区(heap) — 一般由程序员分配释放, new, malloc之类的,若程序员不释放,程序结束时可能由OS回收 。全局区(静态区)(static)— 存放全局变量、静态数据、常量。程序结束后由系统释放。文字常量区 — 常量字符串就是放在这里的。程序结束后由系原创 2015-12-28 08:32:49 · 576 阅读 · 0 评论 -
跳台阶 && 变态跳台阶 (递归和非递归)算法整理
一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。class Solution {public: int jumpFloor(int number) { if(0 >= number) return 0; else if(1 == number) return 1;原创 2015-12-14 07:28:57 · 1771 阅读 · 0 评论 -
斐波那契数列 题集
斐波那契数列 题集 很多题分析到最后都是斐波那契数列了,这里就总结下因为斐波那契数列很好求,我们就值分析不给代码了。 PS: 1. 斐波那契数列可以用递归求,也可以非递归实现,一般我们用非递归的实现,更加高效 2. 注意初始值: 在题目中:f(0) = 0, f(1) =1, f(2) =2 ; 而原始的斐波那契数列中:f(2) =1 所以在题目中,n =1,和 n=2原创 2015-12-16 07:39:04 · 754 阅读 · 0 评论 -
C++位操作
C++位操作包括两种:传统的C语言方式的位操作C++中利用bitset容器的位操作一、传统的C方式位操作: 基本操作: 使用一个unsigned int变量来作为位容器。操作符: | 按位或操作符:result=exp1|exp2;当exp1和exp2中对应位中至少有一个为1时,result中对应位为1,否则为0。 & 按位与操作符::result=exp1&exp2;当exp原创 2016-01-03 09:50:15 · 480 阅读 · 0 评论 -
翻转单词顺序列
翻转单词顺序列 问题: 来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。例如,“student. a am I”。后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am a student.”。Cat对一一的翻转这些单词顺序可不在行,你能帮助他么? 方法一:原创 2015-12-18 08:06:13 · 396 阅读 · 0 评论 -
笔试题中 3种错误处理的方法
笔试题中 3种错误处理的方法一、 函数返回值:比如很多Windows API的返回值为0表示API调用成功,返回值不为零,表示该函数调用中出错了,不同的返回值对应不同的出错类型。优点:和系统API一致缺点:不能方便的使用返回值(因为返回值去表示是否出错了,如main()函数,最后return 0 一样)二、 设置全局变量此时我们可以在返回值中传递结果了,当出错时修改这个全局变量的值 eg.原创 2016-01-03 17:16:02 · 1010 阅读 · 0 评论 -
求前n项和 , 要求不用乘除,循环,判断 (三种方法)
题目:题目:求 1+2+ … +n,要求不能使用乘除法、 for、 while 、 if、 else 、 switch、 case 等关键字以及条件判断语句( A?B:C)。方法1:用递归替代循环,结合短路特性退出递归 针对循环可以用递归来替代,而针对递归的结束可以用n&&(fun())来代替,因为一旦n等于0则不会执行后面的代码了int addtion(int n){原创 2016-08-12 07:29:26 · 2610 阅读 · 0 评论