字符串相乘
题目链接:
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;
}