奇安信测试笔试,未知长度输入
第一题是给出子节点和父节点的对应关系和编号,问你删除某个节点及其子节点时,一共删除了几个节点。
这道题给我难在了输入,三行输入,第一行子节点,第二行是第一行对应的父节点,第三行是要删除的节点,最后输出需要删除的节点的个数。
大部分代码都用来写输入了,这个输入卡了我好几次了,这次我要死死的记住!
#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;
}
查看10道真题和解析