随笔分类 -  算法

1
摘要:1.在计算机中,由于位宽限制,只能进行有限精度的十进制整数加减法,比如在32位宽计算机中,参与运算的操作数和结果必须 在-231~231-1之间。若是需要进行更大规模的十进制整数加法,需要使用特殊的方法实现,比如使用字符串保存操作数和结果,采 纳逐位运算的方式进行。如下:9876543210 + 1234567890 = ?,让字符串 num1="9876543210",字符串 num2="1234567890",结果保存在字符串 result = "11111111100"。-9876543210 + (-1234567890) = 阅读全文
posted @ 2012-12-08 10:45 byfei 阅读(252) 评论(0) 推荐(0) 编辑
摘要:一、定义 位图法就是bitmap的缩写。所谓bitmap,就是用每一位来存放某种状态,适用于大规模数据,但数据状态又不是很多的情况。通常是用来判断某个数据存不存在的。在STL中有一个bitset容器,其实就是位图法二、数据结构unsigned int bit[N];在这个数组里面,可以存储 N * sizeof(int)个数据,但是最大的数只能是N * sizeof(int) - 1。假如,我们要存储的数据范围为0-15,则我们只需要使得N=1,这样就可以把数据存进去三、相关操作1,写入数据定义一个数组: unsigned char bit[8 * 1024];这样做,能存 8K*8=64.. 阅读全文
posted @ 2012-12-05 10:52 byfei 阅读(357) 评论(0) 推荐(0) 编辑
摘要:#include <iostream>using namespace std;/*有两个村,张村和李村张村的人星期一三五说谎李村的人星期二四六说谎一人问,今天周几?结果两个村的人都回答“前天是我说谎的日子”问:今天是周几? *///A 表示张村 B表示李村 ,返回0表示说谎,返回1表示说实话int FindA(int nWeek){ if(nWeek == 1 || nWeek == 3|| nWeek == 5) return 0; return 1;}int FindB(int nWeek){ if(nWeek == 2 || nWeek == 4|| nWeek == 6) 阅读全文
posted @ 2012-12-01 12:01 byfei 阅读(225) 评论(0) 推荐(0) 编辑
摘要:http://bbs.csdn.net/topics/390257148 阅读全文
posted @ 2012-11-23 09:49 byfei 阅读(193) 评论(0) 推荐(0) 编辑
摘要:#define LIST_INIT_SIZE 100#define LISTINCREMENT 10#define ERROR 0#define OK 1#define OVERFLOW -2#include <iostream>#include <malloc.h>#include <stdlib.h>using namespace std;struct sqlist{ int *elem; int length; int listsize;};int InitList_Sq(sqlist &L){ L.elem=(int*)malloc(LIST 阅读全文
posted @ 2012-11-20 11:37 byfei 阅读(151) 评论(0) 推荐(0) 编辑
摘要:递推:构造低阶的规模(如规模为i,一般i=0)的问题,并求出解,推导出问题规模为i+1的问题以及解,依次推到规模为n的问题。(知道第一个,推出下一个,直到达到目的。,关键要找到递推公式) 递归:将问题规模为n的问题,降解成若干个规模为n-1的问题,依次降解,直到问题规模可求,求出低阶规模的解,代入高阶问题中,直至求出规模为n的问题的解。(要知道第一个,需要先知道下一个,直到一个已知的,再反回来,得到上一个,直到第一个。) 递归包括回溯和递推两个过程。 最好的例子是斐波那契数列: 0 1 1 2 3 5 8 13 21 ... ... 总结成公式就是F(n)=F(n-1)+F... 阅读全文
posted @ 2012-11-17 09:58 byfei 阅读(194) 评论(0) 推荐(0) 编辑
摘要:题目:用两个栈实现一个队列。队列的生命如下,请实现它的两个函数appendTail和deleteHead,分别完成在队列尾部插入结点和在队列头部删除结点的功能。template <typename T>class CQueue{public: CQueue(void); ~CQueue(void); void appendtail(const T& node); T deleteHead();private: stack<T> stack1; stack<T> stack2;};解题思路:插入操作在stack1中进行,删除操作在stack2中进行,如 阅读全文
posted @ 2012-11-17 09:37 byfei 阅读(177) 评论(0) 推荐(0) 编辑
摘要:1.strcpystrcpy是拷贝字符串,以\0为标志结束strcpy的原型为char *strcpy_(char *strDest, const char *strScr){ assert((strDest != NULL) && (strScr != NULL)); char *address=strDest; while((*strDest++ = * strScr++) != '\0') NULL ; *strDest = '\0'; //当strScr字符串长度小于原strDest字符串长度时,如果没有改语句,就会出错了。 return 阅读全文
posted @ 2012-11-14 17:09 byfei 阅读(224) 评论(0) 推荐(0) 编辑
摘要:本试题仅用于考查C++/C程序员的基本编程技能。内容限于C++/C常用语法,不涉及数据结构、算法以及深奥的语法。考试成绩能反映出考生的编程质量以及对C++/C的理解程度,但不能反映考生的智力和软件开发能力。笔试时间90分钟。请考生认真答题,切勿轻视。 一、请填写BOOL , float, 指针变量 与“零值”比较的 if 语句。(10分) 提示:这里“零值”可以是0, 0.0 , FALSE或者“空指针”。例如 int 变量 n 与“零值”比较的 if 语句为: if ( n == 0 ) if ( n != 0 ) 以此类推。 请写出 BOOL flag 与“零值”比较的 if 语句: .. 阅读全文
posted @ 2012-11-14 12:04 byfei 阅读(189) 评论(0) 推荐(0) 编辑
摘要:删除结点的操作我们经常碰到,比如一个链表A->B->C->D->E->F->G。如果我们要删除结点E,那么我们只需要让结点D的指针指向结点F即可,但是我们现在只给出链表头结点的指针以及结点E的指针,而又是单项链表,不能在O(1)时间内得到被删除结点前面的那一个结点的指针,所以我们原先的方法是不能在O(1)时间内删除结点E的。那么既然我们不能获得被删除结点的前一个结点的指针,我们就需要转变思路来考虑是否能够用过被删除结点后一个结点的指针来解决方法。因此被删除结点E的后一个结点指针是很容易得到的,也就是E->m_pNext。那么我们可能会想到如下方法:获得 阅读全文
posted @ 2012-11-12 15:16 byfei 阅读(1159) 评论(0) 推荐(0) 编辑
摘要:题目:输入一个链表,输出该链表中倒数第K个结点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾结点是倒数第1个结点。例如一个链表有6个结点,从头结点开始它们的值依次是1、2、3、4、5、6。这个链表的倒数第3个结点是值为4的结点。看到这道题目,最直观的想法,就是先算出链表的长度n,然后倒数第k个结点就是顺序的第(n-k+1)个数,不过这样需要2次遍历链表,如果要求只能遍历链表一次,那么上述算法就不符合要求了。那我们就使用第二种算法,设定两个指针p1和p2,两个指针刚开始都指向链表的第一个结点,然后让p1指针先走(k-1)步,然后再让两个指针一起往后走,当p1指针指向链表最后一个结点的时候 阅读全文
posted @ 2012-11-12 15:03 byfei 阅读(459) 评论(0) 推荐(1) 编辑
摘要:题目:输入一个字符串,打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出字符a、b、c所能排列出来的所有字符串abc、acb、bac、bca、cab、cba。这是一个典型的递归问题,考虑如何将复杂问题分解成简单问题,最后通过递归解决。我们肯定有这样的经验,自己在写abc的全排列的时候,肯定会想首先确定第一个字符,然后考虑后面有什么排列,比如确定第一个字符为a,那么剩下的b和c有两种排列,分别是bc和cb,那么以a开头的字符串有abc,acb这两种排列。这就是我们下面程序所需要用到的解题思路。将字符串排列分解为字符串的第一个字符以及其后的剩余字符。剩余字符串又可以按照前面的思路来解决 阅读全文
posted @ 2012-11-12 14:51 byfei 阅读(171) 评论(0) 推荐(0) 编辑
摘要:题目:输入一个整型数组,数组里有正数也有负数。数组中一个或连续的多个整数组成一个子数组。求所有子数组的和的最大值。要求时间负责度为O(n)。看到这个题目,我们首先想到的是求出这个整型数组所有连续子数组的和,长度为n的数组一共有 n(n+2)/2个子数组,因此要求出这些连续子数组的和最快也需要O(n^2)的时间复杂度。但是题目要求的O(n)的时间复杂度,因此上述思路不能解决问题。看到O(n)时间复杂度,我们就应该能够想到我们只能对整个数组进行一次扫描,在扫描过程中求出最大连续子序列和以及子序列的起点和终点位置。假如输入数组为{1,-2,3,10,-4,7,2,-5},我们尝试从头到尾累加其中的正 阅读全文
posted @ 2012-11-12 11:21 byfei 阅读(149) 评论(0) 推荐(0) 编辑
摘要:1.1思路1: 第一眼看到这样的题目,会举得非常简单,只需要两次遍历数组就可以完成了。第一次遍历,扫描数组中的元素,每次遇到0则count0++,遇到1则count1++,遇到2则count2++,这样一趟下来就能够统计出数组中0,1,2的个数了。然后第二次遍历的时候,只需要对数组进行重新赋值就可以了,从头开始赋值count0个0,count1个1,count2个2。最终完成对数组的排序。1.2思路2: 既然是面试题,那么肯定不会让你这么简单就解决出来了的。面试官说,加入只能进行一次遍历怎么办,然后你就不知道了。 这道题目如果只能进行一次遍历,我们肯定会想到使用多指针。这种题目之前碰到过... 阅读全文
posted @ 2012-11-09 16:26 byfei 阅读(245) 评论(0) 推荐(0) 编辑
摘要:题目:求一个数的质因数分解,比如输入90,输出2*3*3*5。#include <iostream>using namespace std;void Decomposition(int nNum){ for(int i=2;i<nNum;) { if(nNum % i == 0) { nNum = nNum /i; cout<<i<<","; } else { i++; } } if(1<nNum) cout<<nNum<<endl;}int main(){ Decomposition(9999); g 阅读全文
posted @ 2012-11-09 10:54 byfei 阅读(224) 评论(0) 推荐(0) 编辑
摘要:题目:输入一棵二叉树的根节点,求该树的深度。从根节点到叶子结点一次经过的结点形成树的一条路径,最长路径的长度为树的深度。根节点的深度为1。解体思路:如果根节点为空,则深度为0,返回0,递归的出口如果根节点不为空,那么深度至少为1,然后我们求他们左右子树的深度,比较左右子树深度值,返回较大的那一个通过递归调用#include<iostream>#include<stdlib.h>using namespace std;struct BinaryTreeNode{ int m_nValue; BinaryTreeNode* m_pLeft; BinaryTreeNode* 阅读全文
posted @ 2012-11-09 10:32 byfei 阅读(271) 评论(0) 推荐(0) 编辑
摘要:题目:求字符串的最长非重复子序列。比如字符串“dabaccdeff”,它的最长非重复子序列为“dabcef”#include<iostream>#include <stack> #include<stdlib.h>using namespace std;int NoReplicatedSubstring(char *s,int len){ const int tablesize=256; char hashtable [tablesize] = {'0'}; int count=0; for(int i=0;i<len;i++) has 阅读全文
posted @ 2012-11-08 21:35 byfei 阅读(210) 评论(0) 推荐(0) 编辑
摘要:1:如下,是一个“4×4”的数字矩阵,请找出其中的规律,然后编写一个程序,要求能打印出“N×N”时的数字矩阵:1 23 41213145111615610 98 7请用自己最熟悉的语言编写,或者用自然语言描述。至少要包括下列内容:1: 数字矩阵的规律2: 采用的数据结构3:关键的控制流程 #include<iostream> #include<cmath> #define N 4 using namespace std; int main() { int i,j; int count=0; int a[N][N]; for(i=0;i<N/2; 阅读全文
posted @ 2012-11-08 17:05 byfei 阅读(280) 评论(0) 推荐(0) 编辑
摘要:一:通过键盘输入任意一个字符串序列,字符串可能包含多个子串,子串以空格分隔,请编写一个程序,自动分离出各个子串,并使用’,’将其分隔,并且在最后也补充一个’,’,并将子串存储。如果输入”abc def ghi d”,结果将是abc,def,gh,i,d,要求实现函数Void DivideString(const char *pInputStr,long IinputLen,char *pOutputStr);输入:pInputStr:输入字符串IinputLen:输入字符串的长度输出:pOutputStr:输出字符串,字符串已开辟好,与输入字符串等长注意:只需要完成该函数功能算法,中间不需要有 阅读全文
posted @ 2012-11-06 10:46 byfei 阅读(222) 评论(0) 推荐(0) 编辑
摘要:一:给定一个字符串,寻找它的一个最大子字符串,该子字符串是回文。例如给定一个用例的字符串”gabcdcbaef”,那么最大回文 字串是”abcdcba”函数声明为void huiwen(char input[], int len, char output[])#include <string>#include <iostream>using namespace std;//如果是回文字符串,那么从字符串的最中间向两头分别遍历,则应该都是相等的void huiwen(char input[],int len, char output[]){ //start表示回文字串的起 阅读全文
posted @ 2012-11-02 11:49 byfei 阅读(212) 评论(0) 推荐(0) 编辑

1