略
题目内容: 有两个字符串str和substr,str和substr的字符个数不超过10^5,只包含大小写字母和数字。(字符个数不包括字符串结尾处的’\0’。)将substr插入到str中ASCII码最大的那个字符后面,若有多个最大则只考虑第一个。
输入格式:
输入数据只有一行,格式为
str substr
输出格式:
输出插入之后的字符串。
输入样例:
abcab eee
输出样例:
abceeeab
答案:
#include
using namespace std;
int main()
{
string a,b;
cin>>a>>b;
int key=0;
for(int i=1;i<a.length();i++)
{
if(a[i]>a[key])
key=i;
}
for(int j=0;j<=key;j++)
{
cout<<a[j];
}
cout<<b;
for(int j=key+1;j<a.length();j++)
{
cout<<a[j];
}
return 0;
}
题目内容: 求两个不超过200位的非负整数的积。
输入格式: 有两行,每行是一个不超过200位的非负整数,没有多余的前导0。
输出格式: 一行,即相乘后的结果。结果里不能有多余的前导0,即如果结果是342,那么就不能输出为0342。
输入样例:
12345678900
98765432100
输出样例:
1219326311126352690000
答案:
#include
#include
#include
#include
using namespace std;
int main()
{
string a,b;
cin>>a>>b;
int n=a.length()+b.length();
int *s=new int[n];
for(int i=0;i<n;i++)
{
s[i]=0;
}
cout<<endl;
for(int i=0;i<a.length();i++)
{
for(int j=0;j<b.length();j++)
{
s[i+j+1]+=(a[i]-'0')*(b[j]-'0');
}
}
for(int i=a.length()+b.length()-1;i>0;i--)
{
if(s[i]>9)
{
s[i-1]+=s[i]/10;
s[i]%=10;
}
}
int c=0;
for(int i=0;i<n;i++)
{
if(s[i]==0)
c++;
else
break;
}
for(int i=c;i<n;i++)
{
cout<<s[i];
}
if (c==n)
{
cout<<0;
}
return 0;
}
题目内容: 有n只猴子,按顺时针方向围成一圈选大王(编号从1到n),从第1号开始报数,一直数到m,数到m的猴子退出圈外,剩下的猴子再接着从1开始报数。就这样,直到圈内只剩下一只猴子时,这个猴子就是猴王,编程求输入n,m后,输出最后猴王的编号。
输入格式: 输入包含两个整数,第一个是n,第二个是m (0 < m,n <=300)。
**输出格式:**输出包含一行,即最后猴王的编号。
输入样例:
18 2
输出样例:
5
答案: 前一个是带头结点的,后一个是不带头结点的。
#include
using namespace std;
struct Node
{
int data;
Node *next;
};
void SetList(Node *head,int n)
{
Node *tail=head;
for (int i=0;i<n;i++)
{
Node *s=new Node;
s->data=i+1;
tail->next=s;
tail=s;
}
tail->next=head;
}
void DelNode(Node *head,int m)
{
Node *flag=head;
while (head->next->next!=head)
{
for (int i=0;i<m-1;i++)
{
if(flag->next!=head)
flag=flag->next;
else
flag=head->next;
}
Node *d=flag->next;
if(d==head)
{
d=d->next;
flag=flag->next;
}
flag->next=d->next;
delete d;
}
}
int main()
{
int n,m;
cin>>n>>m;
Node *head=new Node;
head->next=head;
SetList(head,n);
DelNode(head,m);
cout<<head->next->data;
return 0;
}
#include
#include
using namespace std;
struct node
{
int data;
node * next;
};
int main ( )
{
node *p=new node;
node *head=p;
int n,m;
cin>>n>>m;
for (int i=1;i<n;i++)
{
p->data=i;
p->next=new node;
p=p->next;
}
p->data=n;
p->next=head;
p=head;
while(p->next!=p)
{
for (int i=0;i<m-2;i++)
{
p=p->next;
}
node *q=p->next;
p->next=q->next;
delete q;
p=p->next;
}
cout<<p->data<<endl;
return 0;
}
题目内容:
通过把“中缀转后缀”和“后缀求值”两个算法功能集成在一起(非简单的顺序调用),实现对中缀表达式直接求值,新算法还是从左到右扫描中缀表达式,但同时使用两个栈,一个暂存操作符,一个暂存操作数,来进行求值。
(支持 + - * / ^ 五种运算)
输入格式:
共1行,为1个字符串,即一个中缀表达式,其中每个数字或符号间由一个空格隔开。
输出格式:
共1行,为一个整数,即求值的结果。
输入样例:
( 2 + 3 ) * 6 + 4 / 2
输出样例:
32
附Python模板:
class Stack:
def __init__(self):
self.items = []
def isEmpty(self):
return self.items == []
def push(self, item):
self.items.append(item)
def pop(self):
return self.items.pop()
def peek(self):
return self.items[len(self.items)-1]
def size(self):
return len(self.items)
def calculate(s):
# 请在此编写你的代码(可删除pass语句)
pass
# 代码结束
print(calculate(input()))
答案:
Python这个不是我写的,我抄了人家的答案:原网址→我是答案
def domath(op,op1,op2):
if op=='*':
return op1*op2
elif op=='/':
return op1/op2
elif op=='+':
return op1+op2
elif op=='-':
return op1-op2
else:
return op1**op2
class Stack:
def __init__(self):
self.items = []
def isEmpty(self):
return self.items == []
def push(self, item):
self.items.append(item)
def pop(self):
return self.items.pop()
def peek(self):
return self.items[len(self.items)-1]
def size(self):
return len(self.items)
def calculate(s):
# 请在此编写你的代码(可删除pass语句)
opStack=Stack()
numStack=Stack()
prec={}
prec['^']=4
prec['*']=3
prec['/']=3
prec['+']=2
prec['-']=2
prec['(']=1
s=s.split()
for token in s:
if token.isdigit():
numStack.push(int(token))
elif token=='(':
opStack.push(token)
elif token==')':
toptoken=opStack.pop()
while toptoken!='(':
operand2=numStack.pop()
operand1=numStack.pop()
result=domath(toptoken,operand1,operand2)
numStack.push(result)
toptoken=opStack.pop()
else:
while(not opStack.isEmpty())and (prec[opStack.peek()]>=prec[token]):
op=opStack.pop()
operand2=numStack.pop()
operand1=numStack.pop()
result=domath(op,operand1,operand2)
numStack.push(result)
opStack.push(token)
while not opStack.isEmpty():
op=opStack.pop()
operand2=numStack.pop()
operand1=numStack.pop()
result=domath(op,operand1,operand2)
numStack.push(result)
return numStack.pop()
print(int(calculate(input())))
题目内容:
实现扩展括号匹配算法,用来检查HTML文档的标记是否匹配。HTML标记应该成对、嵌套出现,开标记是这种形式,闭标记是这种形式。
输入格式:
共1行,为一个字符串,即一个HTML文档中的内容。
输出格式:
共1行,为True或者False,表示该字符串中的标记是否匹配。
输入样例:
Example Hello, world
输出样例:
True
附Python模板:
class Stack:
def __init__(self):
self.items = []
def isEmpty(self):
return self.items == []
def push(self, item):
self.items.append(item)
def pop(self):
return self.items.pop()
def peek(self):
return self.items[len(self.items)-1]
def size(self):
return len(self.items)
def HTMLMatch(s):
# 请在此编写你的代码(可删除pass语句)
pass
# 代码结束
print(HTMLMatch(input()))
答案:
#include
#include
#include
using namespace std;
int main()
{
stack <string> html;
string input;
getline(cin, input);//读入字符输入的字符串
for (int i = 0; i < input.length(); i++)
{
/* 处理读入的数据,把输入的整个字符串分割成小的"" */
if (input[i] != '<') //分割,以"<"为界限
continue;
bool flag = false; //检验小字符串是否是的标志
string mid = ""; //临时存储分割出来的小字符串
while (input[i] != '>')
{
if (input[i] == '/') //如果是,进行标记,但是不存储/(方便最后和栈顶元素比较)
{
flag = true;
i++;
}
else
mid += input[i++]; //进行存储小字符串
}
//mid += '>';
//↑这一句写不写都行,如果不写入栈的就是了
if(!flag) //如果是压入栈
html.push(mid);
else
{
if (mid == html.top())//如果是并且和栈顶相同,弹出栈顶元素
html.pop();
else
html.push(mid);//如果是并且和栈顶不同,压入栈
}
}
if (html.empty())
cout << "True";
else
cout << "False";
return 0;
}
题目内容: 在情报传递过程中,为了防止情报被截获,往往需要对情报用一定的方式加
密,简单的加密算法虽然不足以完全避免情报被破译,但仍然能防止情报被轻易的识别。我们给出一种最简的的加密方法,对给定的一个字符串,把其中从a-y,A-Y的字母用其后继字母替代,把z和Z用a和A替代,则可得到一个简单的加密字符串。
输入格式:
第一行是字符串的数目n。
其余n行每行一个字符串。
输出格式:
输出每行字符串的加密字符串。
输入样例:
1
Hello! How are you!
输出样例:
Ifmmp! Ipx bsf zpv!
答案:
#include
using namespace std;
int main()
{
int n;
cin>>n;
getchar();
string a;
while(n!=0)
{
getline(cin,a);
for(int i=0;i<a.length();i++)
{
if(a[i]>='a'&&a[i]<='z')
a[i]='a'+(a[i]-'a'+1)%26;
else if(a[i]>='A'&&a[i]<='Z')
a[i]='A'+(a[i]-'A'+1)%26;
}
cout<<a<<endl;
n--;
}
return 0;
}
题目内容:、老师给小学生门布置了一些作业,让它们按照一个模版写一些字符串交上来,同学们把作业交上来了,问题来了,这么多的作业老师批改不过来,现在请你帮老师写一个程序,帮助老师确定各个字符串是否合格。
首先老师有一个匹配模版,比如是“aa[123]bb”这一个字符串,同学们交的各种作业字符串如aa1bb、aa2bb、aa3bb都算是正确匹配看,而aacbb就是错误的字符串。(即待查字符串对应于模版方括号内的部分,应该为方括号内字符串的一个子字符)。我们需要做的就是按照模版,找出正确的字符串和所在的行。
输入格式:
输入的第一行为一个整数n,表示有多少个学生的作业,即有多少行需要检查的字符串。(1<=n<=50)
中间为n行字符串,代表着n个学生们写的作业。每个字符串长度小于50。
最后一行为1行字符串,代表着老师给的匹配模板。
输出格式:
输出合格的字符串的行号和该字符串。(中间以空格隔开)
输入样例:
4
Aab
a2B
ab
ABB
a[a2b]b
输出样例:
1 Aab
2 a2B
4 ABB
解析:
这个题模板左右两边的都要匹配,模板中间的也要匹配。
比如对于模板a[a2b]b
,abc
不合法abB
合法。
答案:
#include
#include
using namespace std;
int main()
{
int n;
cin >> n;
string *word = new string[n], A;
for (int i = 0; i < n; i++)
{
cin >> word[i];
}
cin >> A;//模板
int left = A.find('['), right = A.find(']');
string B = A.substr(left + 1, right - left - 1);//模板内容
for (int i = 0; i < n; i++) //从第一个字符串开始
{
if (word[i].length() != A.length() - B.length() - 1)
continue;
bool flag = true,f=false;
for (int j = 0; j < left; j++) //左
{
if (word[i][j] != A[j] && word[i][j] != char(A[j] + 32) && word[i][j] != char(A[j] - 32))
{
flag = false;
break;
}
}
if (flag==false) continue;
for (int j = right+1; j < A.length(); j++)//右
{
if (word[i][j-(right-left)] != A[j] && word[i][j - (right - left)] != char(A[j] + 32) && word[i][j - (right - left)] != char(A[j] - 32))
{
flag = false;
break;
}
}
if (flag==false) continue;
for (int j =0; j < B.length();j++)//中
{
if (word[i][left] == B[j]|| word[i][left] == char(B[j] + 32)|| char(B[j] - 32))
{
f = true;
break;
}
}
if(f==true)
cout << i+1 << " " << word[i] << endl;
}
return 0;
}