随笔分类 -  算法

算法题-大数相乘问题
摘要:今天在网上看到一个大数相乘的问题,题目是这样的:输入两个整数,要求输出这两个数的乘积。输入的数字可能超过计算机内整形数据的存储范围。分析:由于数字无法用一个整形变量存储,很自然的想到用字符串来表示一串数字。然后按照乘法的运算规则,用一个乘数的每一位乘以另一个乘数,然后将所有中间结果按正确位置相加得到最终结果。可以分析得出如果乘数为A和B,A的位数为m,B的位数为n,则乘积结果为m+n-1位(最高位无进位)或m+n位(最高位有进位)。因此可以分配一个m+n的辅存来存储最终结果。为了节约空间,所有的中间结果直接在m+n的辅存上进行累加。最后为了更符合我们的乘法运算逻辑,可以讲数字逆序存储,这样数字 阅读全文
posted @ 2012-04-26 22:56 Jason Yang 阅读(23009) 评论(2) 推荐(5)
算法题-字符串循环移位问题
摘要:字符串循环移位问题是面试中比较容易遇到的,就是输入一个字符串和一个整数,原地输出移位后的字符串。不同的考官可能对程序的具体要求不同,这里要求空间复杂度为O(1)。这里给出两种解答方法。(1)将移动n位看做“每次移动一位,共操作n次”,这是一种化整为零的思维方法。只要能想到这一步,相信下面的代码就不难写出了: 1 void shift_1(char* str) 2 { 3 int len = strlen(str); 4 if(len <= 1) 5 return; 6 char temp = str[len-1]; 7 for(int i=len... 阅读全文
posted @ 2012-04-22 22:34 Jason Yang 阅读(3899) 评论(2) 推荐(5)
微软面试记录
摘要:刚体验了一下微软的面试,总共历时1个半小时,结果估计悲剧了。问到的和算法相关的问题有以下几个:1、字符串循环移位程序编程实现,比如shift("abcde",2), 输出“deabc”.难点在于要求原地移位,空间复杂度为O(1),时间复杂度不做要求2、链表中删除一个结点void delete(ListNode* pHead, ListNode* p)这里链表可能不是正常的,比如存在环,就是有某个结点指回到前面出现的结点去了,存在环且查找节点p失败时必须判断是否出现环,否则程序可能死循环,要求O(1)空间复杂度3、字符串中查找子字符串的位置int find(char *str 阅读全文
posted @ 2012-04-19 16:58 Jason Yang 阅读(642) 评论(0) 推荐(0)