随笔分类 - 算法
成对出现的一组数字,找出两个只出现一次的数字
摘要:记得,当时是去多看面试,感觉,比百度的实习生面试松一点,因为好多算法只是让我说思路,不用写。 二面记得最清晰的问题,就是给很多的一组数,所有数都是成对出现的,只有一个数只出现了一次,面试官问我,怎么弄。我很开心的说,见过这题,异或,最后的结果就是那个只出现一次的数。然后,面试官犹豫了一下,又问,如果是出现两个只出现了一次的数呢(估计是在想,我是不是也知道答案,有没有必要问)。我确认了下时间复杂度要求,要求时间复杂度是O(n),空间复杂度是O(1)。我才不会告诉你我当时没弄出来。。。。。 回来查了查,发现其实也不是太难: (1)首先,只有一个只出现一次的数,直接异或,所有相同的...
阅读全文
输入数字N,按顺序打印出从1到N位的十进制数。比如输入3,则打印出1、2、3一直到最大的3位数即999
摘要:最近找工作,看剑指offer这本书,刚好看到这个题目,感觉上面的代码有一层循环稍有冗余,想试试是不是自己想错了,顺便自己练练手。/* 输入数字N,按顺序打印出从1到N位的十进制数。比如输入3,则打印出1、2、3一直到最大的3位数即999 考虑:大数问题 直接用大数模拟太复杂,直接用深搜比较方便(n个从0到9的全排列)*/#include <iostream>#include <cstdio>#include <cstring>using namespace std;void Print(char *number, int n){ int i=0; for(;
阅读全文
温故知新系列(二)交换两个变量的值不用第三个变量
摘要:对于允许用第三个变量来转存交换两个变量的值,有指针和引用。这里很简单,直接给出代码 View Code 不用第三个变量交换,可以通过以下两个方法 View Code 1 a^=b; 2 b^=a;3 a^=b;4 //或者5 a+=b;6 b=a-b;7 a=a-b; 第一次见到是从刘汝佳老师的书上看到的,但不推荐 我们去使用。 一直以为这是一个挺不错的想法,当然,虽然不会去用,但从没有去想以上会有bug。偶尔看到这个博文,发现原来这样的交换是有隐患的: 当两个数的地址相同的时候,结果会变为0。 View Code 1 #include <iostream> 2 #in...
阅读全文
温故知新系列(一)冒泡排序
摘要:话说,从acm开始,除了刚刚开始的时候写过几次冒泡和选择排序,之后便被TLE弄乖了,转投sort怀抱。 不过,很多时候,不再去追求那种极速的时候,去改进一个算法也是很有趣的事情。 你会说,理解这些有意义么?能比得过快排么? 我想说,我们所追逐的就是一种过程,是对这种思路的更进一步的理解,也许,会有意外发现。 话不多说,先放上最朴素的冒泡(以下排序的结果一律从小到大): 1.从第一个元素开始,与之后相邻的比较,若反序,则交换,这样,一次循环之后,最后一个数一定是最大的,就像泡泡一样,大的慢慢升上来了。 2.重复上述操作,直到n-1次操作之后,整个序就排好了。 //冒泡排序1...
阅读全文
关于0-1背包的动态规划,回溯和分支限界法的一些分析和代码
摘要:首先,说一下什么是0-1背包问题。 有N件物品和一个容量为V的背包。(每种物品均只有一件)第i件物品的费用是c[i],价值是w[i]。求解将哪些物品装入背包可使价值总和最大。 特点是:每种物品仅有一件,可以选择放或不放。然后,我分别用了动态规划法,分支限界法和回溯法来解决这个问题。//=======================================以下是测时间的模板: LARGE_INTEGER BegainTime ; LARGE_INTEGER EndTime ; LARGE_INTEGER Frequency ; QueryPerformance...
阅读全文
浙公网安备 33010602011771号