牛客网的刷题之旅——2020/7/19

字符串相乘

题目链接:
https://www.nowcoder.com/questionTerminal/ff74b3d786de4a30b4cd49b8ad97467f

题目描述
给定两个数字(0-9)字符串(长度不限)求它们的乘积。

输入描述:
第一行为第一个数字字符串
第二行为第二个数字字符串

输出描述:
乘积字符串

输入

123
20

输出

2460

ac代码:

#include<bits/stdc++.h>
using namespace std;
int main()
{
    string a,b,c;
    cin>>a>>b;
    if(a.length()<b.length())
    {
        c=b;
        b=a;
        a=c;
    }
    //cout<<a<<endl<<b<<endl;
    int s=0,ci=0;
    int data[2*a.length()+b.length()+10];
    int index=0;
    for(int i=1;i<=2*a.length()+b.length();i++)
    {
        s=0;
        for(int j=1;j<=i;j++)
        {
            if(b.length()-j>=0&&b.length()-j<b.length()&&(a.length()-i+j-1)>=0&&(a.length()-i+j-1)<a.length())
                {
                   //cout<<b[b.length()-j]<<" "<<a[a.length()-i+j-1]<<endl;
                    s+=(b[b.length()-j]-'0')*(a[a.length()-i+j-1]-'0');
                }
        }
        s+=ci;
        ci=s/10;
        //cout<<"s:"<<s<<endl<<"c:"<<ci<<endl;
        if(s!=0)
            s=s%10;
        data[index++]=s;
    }
    for(index--;data[index]==0;index--);
    for(;index>=0;index--)
    {
        cout<<data[index];
    }
    return 0;
}

树的不同形态

题目链接:
https://www.nowcoder.com/questionTerminal/54713e2ad6ac4a6baa52838cff09662a

题目描述
给定二叉树T(树深度不超过H<=10,深度从1开始,节点个数N<1024,节点编号1~N)的层序和中序遍历,输出T从左向右叶子节点以及树先序和后序遍历序列

输入描述:
输入两行,分别代表层序和中序遍历结果,节点编号按单个空格分开

输出描述:
依次输出 从左向右叶子节点 ,先序, 后序 遍历 。 节点编号按空格分开

输入

3 5 4 2 6 7 1
2 5 3 6 4 7 1

输出

2 6 1
3 5 2 4 6 7 1
2 5 6 1 7 4 3

思路:开始看这道题一直没有思路,看别人的代码也看不懂。看到递归的构造左子树和右子树时,思路就清晰了。

ac代码:

#include<bits/stdc++.h>
using namespace std;
struct Node
{
    int index;
    Node *left,*right;
};

Node* creatTree(vector<int> gfs,vector<int> mfs,int start,int end)
{
    Node *c=NULL;
    /*
    cout<<start<<" "<<end<<endl;
    for(int i=0;i<gfs.size();i++)
    {
        cout<<gfs[i]<<" ";
    }
    cout<<endl;
    */
    if(gfs.size()==0)
        return c;
    int flag=start;
    for(int i=start;i<=end;i++)
    {
        if(gfs[0]==mfs[i])
            flag=i;
    }
    int isleft=0;
    vector<int> left,right;
    for(int i=1;i<gfs.size();i++)
    {
        isleft=0;
        for(int j=start;j<flag;j++)
        {
            if(gfs[i]==mfs[j])
            {
                isleft=1;
            }
        }
        if(isleft==1)
        {
            left.push_back(gfs[i]);
        }else
        {
            right.push_back(gfs[i]);
        }
    }
    //cout<<"hei";
    Node* root=new Node();
    root->index=gfs[0];
    //递归实现
    root->left=creatTree(left,mfs,start,flag-1);
    root->right=creatTree(right,mfs,flag+1,end);

    if((root->left)==NULL&&(root->right)==NULL)
        cout<<root->index<<" ";
    return root;
}

void ffs(Node *node)
{
    if(node==NULL)
        return ;
    cout<<node->index<<" ";
    ffs(node->left);
    ffs(node->right);
}

void lfs(Node *node)
{
    if(node==NULL)
        return ;
    lfs(node->left);
    lfs(node->right);
    cout<<node->index<<" ";
}
int main()
{
    vector<int> mfs,gfs;
    int n;
    while(cin >> n){
        gfs.push_back(n);
        if(cin.get() == '\n') break;

    }
    while(cin >> n){
        mfs.push_back(n);
        if(cin.get() == '\n') break;
    }
    /*
    for(int i=0;i<gfs.size();i++)
        cout<<gfs[i]<<" ";
    cout<<endl;
    for(int i=0;i<mfs.size();i++)
        cout<<mfs[i]<<" ";
    cout<<endl;
    */
    Node *node=creatTree(gfs,mfs,0,gfs.size()-1);
    cout<<endl;
    ffs(node);
    cout<<endl;
    lfs(node);
    return 0;
}

合并区间

题目链接:https://www.nowcoder.com/questionTerminal/0596b6232ce74b18b60ba0367d7f2492

题目描述
用x,y表示一个整数范围区间,现在输入一组这样的范围区间(用空格隔开),请输出这些区间的合并。

输入描述:
一行整数,多个区间用空格隔开。区间的逗号是英文字符。

输出描述:
合并后的区间,用过空格隔开,行末无空格

示例1
输入

1,3 2,5

输出

1,5

示例2
输入

1,3 2,5 8,10 11,15

输出

1,5 8,10 11,15

备注:
x,y均为正整数,并且x<=y。

ac代码:

#include<bits/stdc++.h>
using namespace std;
struct Point
{int x,y;};
//对左端点进行排序
bool cmp(Point p1,Point p2)
{
    return p1.x<=p2.x;
}
int main()
{
    string s;
    int x,y,index=0;
    Point point[1000];
    while(cin>>s)
    {
        int flag=0;
        x=0,y=0;
        for(int i=0;s[i]!=',';flag=i,i++)
            x=x*10+s[i]-'0';
        for(int i=flag+2;i<s.length();i++)
            y=y*10+s[i]-'0';
        point[index].x=x;
        point[index++].y=y;
        if(cin.get()=='\n')
            break;
    }
    /*
    for(int i=0;i<index;i++)
        cout<<point[i].x<<" "<<point[i].y<<endl;
        */
    sort(point, point+index,cmp);
    for(int i=0;i<index-1;i++)
    {
        if(point[i].y>=point[i+1].x)
        {
            point[i+1].x=point[i].x;
            point[i+1].y=max(point[i].y,point[i+1].y);
        }
        else
        {
            printf("%d,%d ",point[i].x,point[i].y);
        }
       // printf("\n%d\n",last);
    }
    printf("%d,%d\n",point[index-1].x,point[index-1].y);
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值