1、集合的交集
已知两个非降序链表序列S1与S2,设计函数构造出S1与S2的交集新链表S3。
输入格式:
输入分两行,分别在每行给出由若干个正整数构成的非降序序列,用−1表示序列的结尾(−1不属于这个序列)。数字用空格间隔。
输出格式:
在一行中输出两个输入序列的交集序列,数字间用空格分开,结尾不能有多余空格;若新链表为空,输出NULL。
输入样例:
1 2 5 -1
2 4 5 8 10 -1
输出样例:
2 5
用python写了之后,在最后一个测试点(大规模数据)会出现内存超限。
a = [int(i) for i in input().split()]
b = [int(i) for i in input().split()]
num = []
if(len(a) == 0) or (len(b)==0):
print("NULL")
else:
for i in a[:len(a)-1]:
for j in b[:len(b)-1]:
if i == j:
num.append(i)
break
l = len(num)
if l == 0:
print("NULL")
else:
for i in num[:l-1]:
print(i,end=" ")
print(num[l-1])
参考了链表,可以解决这个问题:
#include<iostream>
using namespace std;
typedef struct Node{
int data;
struct Node *next;
}*List;
void Creat(List &L){
L = new Node;
L->next = NULL;
List p,q;
p = L;
int x;
while(cin >> x && x != -1){
q = new Node;
q->data = x;
q->next = NULL;
p->next = q;
p = p->next;
}
p->next = NULL;
}
List Merge(List &La,List &Lb)
{
List Lc;
List pa,pb,pc;
Lc = pc = La;
pa = La->next;
pb = Lb->next;
while(pa && pb){
if(pa->data < pb->data)
pa = pa->next;
else if(pb->data < pa->data)
pb = pb->next;
else{
pc->next = pa;
pc = pa;
pa = pa->next;
pb = pb->next;
}
}
pc->next = NULL;
return Lc;
}
void print(List L){
List p;
p = L->next;
if(L->next == NULL)
cout<<"NULL";
else{
while(p->next){
cout<< p->data <<" ";
p = p->next;
}
cout << p->data;
}
}
int main(){
List la,lb,lc;
Creat(la);
Creat(lb);
print(Merge(la,lb));
}
2、最长对称子串
对给定的字符串,本题要求你输出最长对称子串的长度。例如,给定Is PAT&TAP symmetric?,最长对称子串为s PAT&TAP s,于是你应该输出11。
输入格式:
输入在一行中给出长度不超过1000的非空字符串。
输出格式:
在一行中输出最长对称子串的长度。
输入样例:
Is PAT&TAP symmetric?
输出样例:
11
#include<iostream>
#include<string>
using namespace std;
int m1,m2 = 1;
bool OL(string s,int i,int j){
int slen = s.length()-1;
if(i < 0 || j > slen)
return false;
if(s[i] == s[j]){
m1 += 2;
OL(s,i-1,j+1);
}else{
return false;
}
return true;
}
bool JL(string s,int i,int j){
int slen = s.length()-1;
if(i < 0 || j > slen)
return false;
if(s[i] == s[j]){
m2 += 2;
JL(s,i-1,j+1);
}else{
return false;
}
}
int main(){
string s;
int i,j;
int maxl1 = -1,maxl2 = -1;
getline(cin,s);
int len = s.length();
if(len == 1){
cout << 1 << endl;
return 0;
}
for(i = 0; i < len; i++){
m1 = 0;
OL(s,i,i+1);
maxl1 = max(maxl1,m1);
}
for(i = 1; i < len-1; i++){
m2 = 1;
JL(s,i-1,i+1);
maxl2 = max(maxl2,m2);
}
cout << max(maxl1,maxl2) << endl;
return 0;
}
第一个代码有一个点会超时,改为下面的方法:
#include<iostream>
using namespace std;
int main() {
string s;
int i,j;
getline(cin,s);
int m = 1;
int len = s.length();
for(i = 0; i < len; i++){
j = 1;
while(i-j >= 0 && i+j < len && s[i-j] == s[i+j])
j++;
j--;
if(j*2 + 1 > m)
m = j * 2 + 1;
j = 1;
while(i-j+1 >= 0 && i+j < len && s[i-j+1] == s[i+j])
j++;
j--;
if(j*2 > m)
m = j*2;
}
cout<<m;
return 0;
}
还有一个小问题要注意的就是,整个字符串输入时要用getline(),前几次我在输入字符串的时候用的是cin(会自动过滤掉不可见字符(如空格 回车 tab等)),所以测试样例结果一直为0。