奇安信测试笔试,未知长度输入
第一题是给出子节点和父节点的对应关系和编号,问你删除某个节点及其子节点时,一共删除了几个节点。
这道题给我难在了输入,三行输入,第一行子节点,第二行是第一行对应的父节点,第三行是要删除的节点,最后输出需要删除的节点的个数。
大部分代码都用来写输入了,这个输入卡了我好几次了,这次我要死死的记住!
#include <iostream> #include <string> using namespace std; //重点在输入和递归,对于多行未知个数的输入,可以先取一行,如果取不到先用getline取一行,再通过一些区分手段将数据分开。 //此程序主函数部分主要展示了如何输入,下次不记得可以看看。 int del_node(int arr[],int brr[],int del,int n); int main() { string str1; string str2; int n; getline(cin,str1); getline(cin,str2); cin>>n; int size1=str1.size(); int size2=str2.size(); int *arr=new int[size1]; int *brr=new int[size2]; int j=0; for(int i=0;i<size1;) { arr[j]=0; while(i<size1 && str1[i]!=' ' && str1[i]!='\n') { arr[j]=(str1[i]-48)+10*arr[j]; i++; } j++; if(i>=size1||str1[i]=='\n') break; else i++; } j=0; for(int i=0;i<size2;) { brr[j]=0; while(i<size2 && str2[i]!=' ' && str2[i]!='\n') { brr[j]=(str2[i]-48)+10*brr[j]; i++; } j++; if(i>=size2||str2[i]=='\n') break; else i++; } cout<<del_node(arr,brr,n,j); return 0; } int del_node(int arr[],int brr[],int del,int n) { int i=0; int num=0; while(arr[i]!=del && i<n) { i++; } //i此时指向与删除节点相等的值 if(i==n) return 0;//遍历全部都没有找到 if(arr[i]==del) { num++; for(int j=0;j<n;j++) { if(brr[j]==arr[i]) { num=num+del_node(arr,brr,arr[j],n); } } } return num; }第二题是给你N个数,从1-5轮流报数,报到5的人出列,队尾和队首衔接报数,直到队尾的报到5为止,问队尾的人是第几个幸运的人。
找规律找了一会,找到之后恍然大悟,我感觉先人脑缕清思路,分类讨论完毕之后在动笔,代码几乎一气呵成,反而写写想想,想想写写就总会错误百出,调试不成。
我的思路是这样的,n表示的是当前这轮(从头到尾报数一次为一轮)的总人数,num表示当前这轮报到5的人数(幸运的人数),t_n表示此时队尾所报的数是几,如果是0就表示,此时队尾报的数是5,他幸运了,就可以结束了,用count来统计截止此时的幸运人数,输出就可以了。
#include <iostream> using namespace std; int lucky(int start,int n) { int count=0; int t_n=0; int num=0;//当前行删掉的数 while(n>0) { num=(n+t_n)/5;// t_n=(t_n+n)%5; count=count+num; n=n-num; if(t_n==0) break; } return count; } int main() { int n; cin>>n; cout<<lucky(1,n)<<endl; return 0; }