第1关:首个重复出现2次的字符
1.题目描述
对于一个字符串,请设计一个高效算法,找到第二次重复出现的字符。
给定一个字符串(不一定全为字母),请返回第一个重复出现两次的字符(也就是一共出现3次)。字符串的长度小于等于500。例如abzxyzza中,第1个重复出现两次的字符是z,则该函数应该返回z,如果没有重复出现两次以上的字符,则输出'\n'(回车符)。
2.函数接口定义:
/* 返回第1个重复出现两次的字符 */
char findFirstRepeat(char* pStr);
其中 pStr 是传入的字符串。函数须返回 pStr 中 第1次重复出现的字符。
2.裁判测试程序样例:
#include <stdio.h>
#include <string.h>
/* 返回第1个重复出现的字符 */
char findFirstRepeat(char* pStr);
int main(void)
{
char str[501], c;
int i = 0;
while ((c = getchar()) != '\n')
str[i++] = c;
str[i] = '\0';
c = findFirstRepeat(str);
putchar(c);
return 0;
}
//**************begin********************
char findFirstRepeat(char* pStr){
}
//*************end*************************
3.输入样例1:
qywyer23tddya
4.输出样例1:
y
3.输入样例2:
qywyer23tdda
4.输出样例2:
上答案:
#include <stdio.h>
#include <string.h>
/* 返回第1个重复出现两次的字符 */
char findFirstRepeat(char* pStr);
int main(void)
{
char str[501], c;
int i = 0;
while ((c = getchar()) != '\n')
str[i++] = c;
str[i] = '\0';
c = findFirstRepeat(str);
putchar(c);
return 0;
}
//**************begin********************
char findFirstRepeat(char* pStr){
char q[510]={0};
int q1[510]={0};
int n=0,l1=strlen(pStr);
for(int i=0;i<l1;i++)
{
int a=0;
for(int j=0;q[j];j++)
{
if(pStr[i]==q[j])
{
q1[j]++;
a=1;
break;
}
}
int l2=strlen(pStr);
for(int j=0;j<l2;j++)
{
if(q1[j]==2)
{
return pStr[i];
break;
}
}
if(a==0&&i!=l1-1)
{
q[n++]=pStr[i];
}
if(i==l1-1)
{
return '\n';
}
}
return 0;
}
//*************end*************************
第2关:三元组顺序表表示的稀疏矩阵转置
1. 题目描述
题要求实现一个函数,实现三元组顺序表表示的稀疏矩阵转置。
函数接口定义:
struct tripletable * trans(struct tripletable *t1);
其中 t1 是用户传入的参数。 函数须返回转置后的三元组顺序表指针。
2. 裁判测试程序样例:
#include <stdio.h>
#include <stdlib.h>
#define M 100
struct node{
int i,j,v;
};
struct tripletable
{
struct node S[M];
int m,n,t;
};
struct tripletable * create()
{ int i;
struct tripletable *head=(struct tripletable *)malloc(sizeof(struct tripletable));
scanf("%d%d%d",&(head->m),&(head->n),&(head->t));
for(i=0;i<head->t;i++)
scanf("%d%d%d",&(head->S[i].i),&(head->S[i].j),&(head->S[i].v));
return head;
}
void print(struct tripletable * head)
{
int i;
for(i=0;i<head->t;i++)
printf("%d %d %d\n",(head->S[i].i),(head->S[i].j),(head->S[i].v));
}
struct tripletable * trans(struct tripletable *t1);
int main()
{
struct tripletable * head,*t2;
head=create();
t2=trans(head);
print(t2);
return 0;
}
//********************begin***********************
struct tripletable * trans(struct tripletable *t1){
}
//***********************end*********************
3.输入样例:
输入第1行为矩阵行数m、列数n及非零元素个数t。 依次输入t行,每行3个数,分别表示非零元素的行标、列标和值。
3 4 3 0 1 -5 1 0 1 2 2 2
4.输出样例:
输出转置后的三元组顺序表结果,下标从小到大按行优先顺序(同一行按列标小的在前),每行输出非零元素的行标、列标和值,行标、列标和值之间用空格分隔,共t行。
0 1 1 1 0 -5 2 2 2
上答案:
#include <stdio.h>
#include <stdlib.h>
#define M 100
struct node{
int i,j,v;
};
struct tripletable
{
struct node S[M];
int m,n,t;
};
struct tripletable * create()
{ int i;
struct tripletable *head=(struct tripletable *)malloc(sizeof(struct tripletable));
scanf("%d%d%d",&(head->m),&(head->n),&(head->t));
for(i=0;i<head->t;i++)
scanf("%d%d%d",&(head->S[i].i),&(head->S[i].j),&(head->S[i].v));
return head;
}
void print(struct tripletable * head)
{
int i;
for(i=0;i<head->t;i++)
printf("%d %d %d\n",(head->S[i].i),(head->S[i].j),(head->S[i].v));
}
struct tripletable * trans(struct tripletable *t1);
int main()
{
struct tripletable * head,*t2;
head=create();
t2=trans(head);
print(t2);
return 0;
}
//*********************begin*************************
struct tripletable* trans(struct tripletable* t1)
{
struct tripletable* t2 = (struct tripletable*)malloc(sizeof(struct tripletable));
int col,loc;
(t2->m) = (t1->n);
(t2->n) = (t1->m);
(t2->t) = (t1->t);
if(t1->t)
{
loc=0;
for (int i = 0; i<t1->n; i++)
{
for (int k = 0; k < t1->t; k++)
{
if (t1->S[k].j == i)
{
t2->S[loc].v = t1->S[loc].v;
t2->S[loc].i = t1->S[loc].j;
t2->S[loc].j = t1->S[loc].i;
loc++;
}
}
}
}
for(int loc=0;loc<t2->t-1;loc++)
{
for(int lco=0;lco<t2->t-1-loc;lco++)
{
if(t2->S[lco].i>t2->S[lco+1].i)
{
node t=t2->S[lco];
t2->S[lco]=t2->S[lco+1];
t2->S[lco+1]=t;
}
}
}
for(int loc=0;loc<t2->t;loc++)
{
if(t2->S[loc].i==t2->S[loc+1].i)
{
if(t2->S[loc].j>t2->S[loc+1].j){
node q=t2->S[loc];
t2->S[loc]=t2->S[loc+1];
t2->S[loc+1]=q;
}
}
}
return t2;
}