|
有一个数组a[1000]存放0--1000;要求每隔二个数删掉一个数,到末尾时循环至开头继续进行,求最后一个被删掉的数的原始下标位置。 以7个数为例: {0,1,2,3,4,5,6,7} 0-->1-->2(删除)-->3-->4-->5(删除)-->6-->7-->0(删除),如此循环直到最后一个数被删除。 方法1:数组 #include <iostream> using namespace std; #define null 1000
int main() { int arr[1000]; for (int i=0;i<1000;++i) arr[i]=i; int j=0; int count=0; while(count<999) { while(arr[j%1000]==null) j=(++j)%1000; j=(++j)%1000; while(arr[j%1000]==null) j=(++j)%1000; j=(++j)%1000; while(arr[j%1000]==null) j=(++j)%1000; arr[j]=null; ++count; } while(arr[j]==null) j=(++j)%1000;
cout<<j<<endl; return 0; }方法2:链表 #include<iostream> using namespace std; #define null 0 struct node { int data; node* next; }; int main() { node* head=new node; head->data=0; head->next=null; node* p=head; for(int i=1;i<1000;i++) { node* tmp=new node; tmp->data=i; tmp->next=null; head->next=tmp; head=head->next; } head->next=p; while(p!=p->next) { p->next->next=p->next->next->next; p=p->next->next; } cout<<p->data; return 0; } 方法3:通用算法 #include <stdio.h> #define MAXLINE 1000 //元素个数 /* MAXLINE 元素个数 a[] 元素数组 R[] 指针场 suffix 下标 index 返回最后的下标序号 values 返回最后的下标对应的值 start 从第几个开始 K 间隔 */ int find_n(int a[],int R[],int K,int& index,int& values,int s=0) { int suffix; int front_node,current_node; suffix=0; if(s==0) { current_node=0; front_node=MAXLINE-1; } else { current_node=s; front_node=s-1; } while(R[front_node]!=front_node) { printf("%d\n",a[current_node]); R[front_node]=R[current_node]; if(K==1) { current_node=R[front_node]; continue; } for(int i=0;i<K;i++){ front_node=R[front_node]; } current_node=R[front_node]; } index=front_node; values=a[front_node];
return 0; } int main(void) { int a[MAXLINE],R[MAXLINE],suffix,index,values,start,i,K; suffix=index=values=start=0; K=2;
for(i=0;i<MAXLINE;i++) { a[i]=i; R[i]=i+1; } R[i-1]=0; find_n(a,R,K,index,values,2); printf("the value is %d,%d\n",index,values); return 0; }
试题: void test2() { char string[10], str1[10]; int i; for(i=0; i<10; i++) { str1[i] = 'a'; } strcpy( string, str1 ); } 解答:对试题2,如果面试者指出字符数组str1不能在数组内结束可以给3分;如果面试者指出strcpy(string, str1)调用使得从str1内存起复制到string内存起所复制的字节数具有不确定性可以给7分,在此基础上指出库函数strcpy工作方式的给10 分; str1不能在数组内结束:因为str1的存储为:{a,a,a,a,a,a,a,a,a,a},没有'\0'(字符串结束符),所以不能结束 strcpy( char *s1,char *s2)他的工作原理是,扫描s2指向的内存,逐个字符付到s1所指向的内存,直到碰到'\0',因为str1结尾没有'\0',所以具有不确定性,不知道他后面还会付什么东东。 正确应如下 void test2() { char string[10], str1[10]; int i; for(i=0; i<9; i++) { str1[i] = 'a'+i; //把abcdefghi赋值给字符数组 } str[i]='\0';//加上结束符 strcpy( string, str1 ); }
第二个code题是实现strcmp int StrCmp(const char *str1, const char *str2) 做是做对了,没有抄搞,比较乱 int StrCmp(const char *str1, const char *str2) { assert(str1 && srt2); while (*str1 && *str2 && *str1 == *str2) { str1++, str2++; } if (*str1 && *str2) return (*str1-*str2); elseif (*str1 && *str2==0) return 1; elseif (*str1 = = 0 && *str2) return -1; else return 0; }
int StrCmp(const char *str1, const char *str2) { //省略判断空指针(自己保证) while(*str1 && *str1++ = = *str2++); return *str1-*str2; } 第三个code题是实现子串定位 int FindSubStr(const char *MainStr, const char *SubStr) 做是做对了,没有抄搞,比较乱 int MyStrstr(const char* MainStr, const char* SubStr) { const char *p; const char *q; const char * u = MainStr;
//assert((MainStr!=NULL)&&( SubStr!=NULL));//用断言对输入进行判断 while(*MainStr) //内部进行递增 { p = MainStr; q = SubStr; while(*q && *p && *p++ == *q++); if(!*q ) { return MainStr - u +1 ;//MainStr指向当前起始位,u指向 } MainStr ++; } return -1; }
分析: int arr[] = {6,7,8,9,10}; int *ptr = arr; *(ptr++)+=123; printf(“ %d %d ”, *ptr, *(++ptr)); 输出:8 8 过程:对于*(ptr++)+=123;先做加法6+123,然后++,指针指向7;对于printf(“ %d %d ”, *ptr, *(++ptr));从后往前执行,指针先++,指向8,然后输出8,紧接着再输出8
|
请遵守《互联网电子公告服务管理规定》及中华人民共和国其他各项有关法律法规。
严禁发表危害国家安全、损害国家利益、破坏民族团结、破坏国家宗教政策、破坏社会稳定、侮辱、诽谤、教唆、淫秽等内容的评论 。
用户需对自己在使用本站服务过程中的行为承担法律责任(直接或间接导致的)。
本站管理员有权保留或删除评论内容。
评论内容只代表网友个人观点,与本网站立场无关。 |
|