《编程珠玑》第二章
一、题目:
A题:给定一个最多包含40亿个随机排列的32位整数的顺序文件,找出一个不在文件中的32位整数。在文件中至少存在这样一个数?
1、如果有足够的内存,如何处理?
2、如果内存不足,仅可以用文件来进行处理,如何处理?
答:
1 采用位图,表示所有的32位整数,约要512M空间
2 内存不足,可以采用如下思想:
按最高位分为两段,没有出现的那个数,肯定在比较小的段里面。
如果比较少的段最高位为1,那么缺少的那个数的最高位也为1.
如果比较少的段最高位为0,那么少的那个数的最高位也是0.
依次按以上方法去处理每个位。
B题:字符串循环移位比如abcdef 左移三位,则变成defabc
答:
解法一:旋转前i个字符,可以预先将这i个字符拷贝到辅助空间,剩下的n-i向前移动i个位置,填充剩余的i个空间。
解法二:用递归函数每次向前移位一个,递归i次。
解法三:
#include<stdlib.h> #include<stdio.h> #include<string.h> static void _rever(char *strseq,int n) { int i = 0,j = n-1; char t; while(i < j) { t = strseq[i]; strseq[i] = strseq[j];strseq[j] = t; i++;j--; } } char* rever(char *strseq,int i,int len) { if(strseq == NULL && i > len ) return NULL; if(i <= 0 || i == len) return strseq; _rever(strseq,len); _rever(strseq,i); _rever(strseq+i,len-i); return strseq; } void main() { char strseq[100]; scanf("%s",strseq); char *result = NULL; printf("%d ",strlen(strseq)); result = rever(strseq,3,strlen(strseq)); if(result) printf("%s ",result); system("pause"); }
当i > n时,我们还可以的处理方式是 i = i % n;
解法四:
#include <iostream> using namespace std; static void swap(char &a,char &b) { char t = a; a = b; b = t; } void doRotate(string &str,int n,int m,int start,int end,bool flag) { if(m == 0 || start == end) return; //标记为true,表示向右旋转前m个字符 if(flag == true) { int i = start; int j = start + m; int step = n - (n%m + m); int k = 0; for( ;k < step;k++,i++,j++) swap(str[i],str[j]); doRotate(str,n-k,n%m,i,end,false); }else { int i = end; int j = end - m; int step = n - (n%m + m); int k = 0; for(;k < step;k++,i--,j--) swap(str[i],str[j]); doRotate(str,n-k,n%m,start,i,true); } }; void main() { string str = "abc12345"; cout<<str<<endl; doRotate(str,str.length(),3,0,str.length()-1,true); cout<<str<<endl; system("pause"); }