2013年3月27日

摘要: 输入一个整数,输出该数二进制表示中1的个数。附加题:判断一个数是否是2的幂。一个整数数组里除了两个数字以外,其他数字都出现两次。请找出只出现一次的数字,要求时间复杂度O(n),空间复杂度O(1)。写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/即加减乘除四则运算符号。1、思路: 常规方法:逐位和1做与运算,看是否为1。如果右移位,当符号位为1时,会陷入死循环(高位补1)。所以选择左移位,当标志位为0时说明所有位都移动完成。 巧妙方法:当n-1时,与n相比,最右边的1变为0,再右侧的0变为1。所以n&(n-1)不为0,则计数加1,有几个1就有几次循环。 判断2的幂:用二进 阅读全文
posted @ 2013-03-27 11:35 月moon鸟 阅读(235) 评论(0) 推荐(0) 编辑

2013年3月25日

摘要: 计算两个字符串的最长公共子序列(LCS),且公共子序列在字符串中不需要是连续的。计算两个字符串的距离,完全相同的字符串距离为0,可以通过修改一个字符、增加一个字符或删除一个字符三种方式来使两个字符串相同,但这些方式会使得距离加1。1、思路: 详见http://zhedahht.blog.163.com/ 1 int LCS(const char* str1, const char* str2) 2 { 3 int i, j; 4 int len1 = strlen(str1); 5 int len2 = strlen(str2); 6 int **dp = n... 阅读全文
posted @ 2013-03-25 20:50 月moon鸟 阅读(505) 评论(0) 推荐(0) 编辑
摘要: 有N件物品和一个重量为M的背包。第i件物品的重量是w[i],价值是v[i]。求解将哪些物品装入背包可使价值总和最大。有一个无序、元素个数为2n的正整数数组,要求:如何能把这个数组分割为两个子数组,子数组的元素个数不限,并使两个子数组之和最接近。有一个无序、元素个数为2n的正整数数组,要求:如何能把这个数组分割为元素个数为n的两个数组,并使两个子数组之和最接近。有两个数组a,b,大小都为n,数组元素的值任意整形数,无序,要求:通过交换a,b中的元素,使[数组a元素的和]与[数组b元素的和]之间的差最小。1、思路: f(i,j)表示前i个物品取任意个放入容量为j的背包中的最大价值。f(i,j)=. 阅读全文
posted @ 2013-03-25 20:42 月moon鸟 阅读(502) 评论(0) 推荐(0) 编辑

2013年3月24日

摘要: 给定一个长度为N的数组,找出一个最长的单调自增子序列(不一定连续,但是顺序不能乱)。从一列数中筛除尽可能少的数使得从左往右看,这些数是从小到大再从大到小的(网易)。1、思路: 定义L(i):以ai为最后一个元素的最长子序列的长度。当i=1或ai<min{a1,a2,...,a(i-1)}时,L(i)=1; 当1≤j≤i-1且aj<ai时,L(i)=max{L(j)}+1。时间复杂度O(n2)。LIS 1 #include <iostream> 2 using namespace std; 3 #define len(a) (sizeof(a) / sizeof(a[0] 阅读全文
posted @ 2013-03-24 10:37 月moon鸟 阅读(408) 评论(0) 推荐(0) 编辑

2013年3月23日

摘要: 输入数字n,按顺序打印出从1到最大的n位十进制。输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印出所有数字中最小的一个。大数相加和大数相乘。1、思路: 首先想到的方法必然是确定上限,比如n=3,上限是100。但是当n很大时,就算用long long也有可能溢出,所以考虑将数字转成字符处理。如果用字符来模拟加法操作,过程比较复杂。但是用数字全排列则能很好的解决问题,即各个位置上0~9都出现一遍。在打印的时候要注意,以0开头的字符不能打印出来。Print1ToMax 1 #include <stdio.h> 2 #include <string.h> 3 4 v 阅读全文
posted @ 2013-03-23 17:55 月moon鸟 阅读(239) 评论(0) 推荐(0) 编辑
摘要: 有一个整数数组,求出连续子数组的和的最大值。有一个首尾相连的整数数组,求出连续子数组的和的最大值。在数组中,数字减去它右边的数字得到一个数对之差。求所有数对之差的最大值。1、思路: 动态规划思路:用函数f(i)表示以第i个数字结尾的子数组的最大和。当f(i-1)<0时,则以第i个数字结尾的子数组就是第i个数字本身;当f(i-1)>0时,f(i)=f(i-1)+i。虽然我们用递归的方式分析动态规划的问题,但都会基于循环去编码。GreatestSumOfSubArray 1 bool g_InvalidInput = false; 2 3 int FindGreatestSumOfSu 阅读全文
posted @ 2013-03-23 11:06 月moon鸟 阅读(246) 评论(0) 推荐(0) 编辑

导航