奇安信测试笔试,未知长度输入

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



#笔试题目#
全部评论
不定长输入是真的头痛
点赞 回复 分享
发布于 2021-03-28 20:27
可以用python吗
点赞 回复 分享
发布于 2022-03-15 09:59

相关推荐

点赞 评论 收藏
分享
评论
6
33
分享
牛客网
牛客企业服务