百度的一些算法

 

两个已排序的整型数组,求交集,最快算法

 

输入:两个已排序的整型数组(int a[m], b[n])

 

输出:两个数组的交集

#include <iostream> using namespace std; /* *问题描述:两个已排序的整型数组,求交集,最快算法 ×输入:两个已排序的整型数组(int a[m], b[n]) ×输出:两个数组的交集 *思想:二路归并,时间复杂度为0(min(len_A, len_B)) */ void GetIntersect(int A[], int B[], int len_A, int len_B) { int i = 0; int j = 0; while(i<len_A && j<len_B) { if (A[i] == B[j]) { cout<<A[i]<<" "; i++; j++; } else if (A[i] < B[j]) i++; else j++; } } /* *思路2;根据有序这个条件,进行二分查找。对较短的数组中每一个元素在另一个长的元素里面查找 ×若找到则为交集 ×时间复杂度为O(m*lgn) */ /* *思路2:根据一个数组建立一个hash表,然后对另一个数组中的元素进行查询操作,若找到则为交集的元素 ×时间复杂度:O(M+N),m,n分别为两数组的长度 */ /* *思路4:对一个数组的中的元素建立位向量,另一个数组进行查询操作。(位向量很好,要掌握啊) ×貌似这样,要求数组中的元素都为正吧。 */ int main() { int A[] = {1, 3, 5, 6, 7, 9}; int B[] = {1, 5, 6, 9, 10, 12, 15}; int len_A = sizeof(A) / sizeof(A[0]); int len_B = sizeof(B) / sizeof(B[0]); GetIntersect(A, B, len_A, len_B); cout<<endl; } 

  百度的一些算法_第1张图片

#include <iostream> using namespace std; inline bool isNum(char c) { return (c >= '0' && c <= '9'); } int maxContinueMum(const char *inputStr, char *outputStr) { int max = 0; const char *end = NULL; while (*inputStr != '/0') { int length = 0; while (isNum(*inputStr)) { inputStr++; length++; } if (length > max) { max = length; end = inputStr; } inputStr++; } //将end-max到end之间的字符拷贝到outputStr中 for (const char *p = end - max; p < end; p++) *outputStr++ = *p; *outputStr = '/0'; return max; } int main() { const char *input = "abcd12345ed125ss123456789"; char *output = new char[strlen(input) + 1](); int len = maxContinueMum(input, output); printf("%d %s/n", len, output); return 0; } 

 

 

简述:实现一个函数,对一个正整数n,算得到1需要的最少操作次数:

  如果n为偶数,将其处以2;  如果n为奇数,可以加1或减1;  一直处理下去。

  例子:

  ret = func(7);

  ret = 4,可以证明最少需要4次运算

  n = 7

  n—1 6

  n/2 3

  n-1 2

  n/2 1

  要求:实现函数(实现尽可能高效)

  Int func(unsign int n);n为输入,返回最小的运算次数。

  给出思路(文字描述),完成代码,并分析你算法的时间复杂度。

 

解答:(这题有点拿不准,望各位高手指点~)

思路:根据一个原则,遇偶除2,遇奇减1。

代码:(count就是次数,复杂度不说了)

 

http://topic.csdn.net/u/20070925/16/e345f80c-9299-4ac1-80d3-1daabc283dfc.html

#include <iostream> using namespace std; int fun1(int n) { int res = 0; while (n != 1) { if((n & 0x1) == 1) //奇数 { n -= 1 ; res++; } n >>= 1; res++; } return res; } int fun2(int n) { int res = 0; while(n != 1) { if (n==1||n==2||n==3) { res += n-1;//当n=1,count+=0;当n=2,count+=1;当n=3,count+=2 break; } if ((n & 0x1) == 1)//奇数 { res++; if((n % 4) == 1) n--; else n++; res++; } n >>= 1; res++; } return res; } int func3(unsigned int n) { unsigned int tmp1,tmp2; if(n == 1 || n == 0) return 0; if(n%2) { tmp1 = func3(n+1); tmp2 = func3(n-1); return tmp1>tmp2 ? tmp2 +1:tmp1+1; } return 1+func3(n/2); } int main() { for (int i = 1; i <= 100; i++) { printf("%-3d %-3d %-3d %-3d/n", i, fun1(i), fun2(i), func3(i)); } return 0; } 

 

 

请实现两棵树是否相等的比较,相等返回,否则返回其他值,并说明算法复杂度。

数据结构为:

typedef struct_TreeNode{

char c;

TreeNode *leftchild;

TreeNode *rightchild;

}TreeNode;

函数接口为:int CompTree(TreeNode* tree1,TreeNode* tree2);

注:A、B两棵树相等当且仅当Root->c==RootB–>c,而且A和B的左右子树相等或者左右互换相等。

#include <iostream> #include <cassert> using namespace std; typedef struct TreeNode{ char c; TreeNode *leftchild; TreeNode *rightchild; }TreeNode; TreeNode* CreateTree(char arr[], int cur, int length) { assert(length > 0); TreeNode *root = new TreeNode; root->c = arr[cur]; root->leftchild = NULL; root->rightchild = NULL; if(2*cur + 1 < length) root->leftchild = CreateTree(arr, 2*cur+1, length); if(2*cur + 2 < length) root->rightchild = CreateTree(arr, 2*cur + 2, length); return root; } /* *函数功能:前序输出树 */ void PreOrder(TreeNode *root) { if (root != NULL) { cout<<root->c<<" "; PreOrder(root->leftchild); PreOrder(root->rightchild); } } /* *函数功能:比较两个树 */ bool CompTree(TreeNode* tree1,TreeNode* tree2) { if ((NULL != tree1) && (NULL != tree2)) //若当前节点都不空,递归进行比较 { if(tree1->c != tree2->c) return false; else { bool cmpChild1 = CompTree(tree1->leftchild, tree2->leftchild) && CompTree(tree1->rightchild, tree2->rightchild); bool cmpChild2 = CompTree(tree1->leftchild, tree2->rightchild) && CompTree(tree1->rightchild, tree2->leftchild); return (cmpChild2 || cmpChild1); } } else if ((tree1 == NULL) && (tree2 == NULL)) //两个空树定义为相等,因为当比较叶子节点的左右节点时要用到 return true; return false; } int main() { char A[] = "wangyang"; char B[] = "yangwang"; TreeNode *tree1 = CreateTree(A, 0, strlen(A)); TreeNode *tree2 = CreateTree(B, 0 ,strlen(B)); PreOrder(tree1); cout<<endl; PreOrder(tree2); cout<<endl; if (CompTree(tree1, tree2) == true) cout<<"相等"<<endl; else cout<<"不相等"<<endl; return 0; } 

 

 

用 C 语言实现函数void * memmove(void *dest,const void *src,size_t n)。memmove

函数的功能是拷贝src 所指的内存内容前n 个字节到 dest 所指的地址上。

#include "stdafx.h" #include <iostream> #include <algorithm> #include <cassert> using namespace std; void* MemMove(void *dest,const void *src,size_t n) { assert((dest != NULL) && (src != NULL)); if(dest == src) return dest; char *p1 = (char*)dest; char *p2 = (char*)src; /*src和dest共用一块内存区域*/ if ((dest > src) && (dest < (char*)src + n)) { for (int i = n-1; i>=0; i--) //逆向拷贝 p1[i] = p2[i]; } else { //正向拷贝 for (int i = 0; i<n; i++) p1[i] = p2[i]; } return dest; } int main() { char *str = "wangyang"; char *dest = new char[strlen(str)]; MemMove(dest, str, strlen(str)); dest[strlen(str)] = '/0'; cout<<dest<<endl; system("pause"); } 

 

你可能感兴趣的:(算法,tree,百度,null,fun,output)