1.题目描述
Node有2个属性{id:Int, name:string},
输入一个Node链表collection,及分组标识splitter:string,将Node.name==splitter作为分组条件,对传入的Node链表进行分组。
1.1输入描述:
第一行是分组条件,是一个字符串
第二行开始,每行是一个Node实例{id:Int, name:string},Ex:1,name1
1.2输出描述:
第一行输出分组总数
第二行开始,每行输出分组后的Node,每行一个分组,Node实例间使用|做为分隔符,输出顺序与输入顺序保持一致
1.3示例1
(输入输出示例仅供调试,后台判题数据一般不包含示例)
输入
*
1,name1
2,name2
3,*
4,name4
5,name5
输出
2
1,name1|2,name2
4,name4|5,name5
备注:
输入不满足要求,输出为0
只满足正确输入,不正确输入时,不符合!
#include<stdio.h>
#include<string.h>
#include<malloc.h>
typedef struct Node
{
int id;
char name[1000];
}node;
int main(void)
{
int i = 0,count=0;
char splitter[1000];
int temp[1000] = { 0 };
node arr[1000];
scanf("%s", &splitter);
while (scanf("%d,%s",&arr[i].id,&arr[i].name) != EOF)
{
//判断不为空,为空不合法
if (arr[i].id != NULL && arr[i].name != NULL)
{
if (strcmp(splitter, &(arr[i].name)) == 0)
{
temp[i] = 1;
count++;
}
i++;
}
else
{
printf("0\n");
return 0;
}
}
//输入一组为不合法
if (i<2)
{
printf("0\n");
return 0;
}
printf("%d\n", count + 1);
for (int j = 0; j < i; j++)
{
if (temp[j] == 0 && temp[j + 1] == 0 && j!=(i-1))
{
printf("%d,%s|", arr[j].id, arr[j].name);
}
else
{
if (strcmp(splitter, &(arr[j].name)) == 0)
{
continue;
}
else
{
printf("%d,%s\n", arr[j].id, arr[j].name);
}
}
}
}
题目2 有向图寻找环路
2.1题目描述
给定一个有向图,假定最多10个节点,节点编号依次为A~J,如果A节点到B节点之间有通路则描述为A->B,多条边的描述之间以分号隔开,给定一个有向图,求该有向图中的所有环路,环路以节点编号的最小的节点开始输出,假定一个有向图最多一个环路,如果没有环路则输出空字符串“-”。输入为连接链表。
2.2输入描述:
输入为连接链表字符串,如 :A->B;B->D;C->B;C->E;D->C
2.3输出描述:
环路节点组成的字符串,如:输出字符串BDC,标识B->D->C->B组成环路
2.4示例1
输入
A->B;B->D;C->B;C->E;D->C
输出
BDC
package main
import (
"fmt"
"regexp"
"strings"
)
//字符转数字,如A->0
func a2i(r uint8) int {
return int(r)-'A'
}
func i2a(i int) string {
return string(i+'A')
}
var find=false
func dfs(i int,adjacentTable [][]int,used []bool,path []int) {
//找到环路
if used[i]{
for _,v:=range path{
if v==i{
//找到环起点
find=true
}
if find{
fmt.Print(i2a(v))
}
}
return
}else{
used[i]=true
//golang里的slice很特别
//形参slice append不影响实参,因此不需要还原
path = append(path, i)
for _,v:=range adjacentTable[i]{
dfs(v,adjacentTable,used,path)
}
used[i]=false
}
}
func main() {
input:="A->B;B->D;C->B;C->E;D->C"
fmt.Scan(&input)
//检查输入合法性
valid,_:=regexp.MatchString("[A-J]->[A-J](;[A-J]->[A-J])*",input)
if !valid{
fmt.Println("-")
return
}
adjacentTable:=make([][]int,10)
paths:=strings.Split(input,";")
for _,p:=range paths{
adjacentTable[a2i(p[0])]= append(adjacentTable[a2i(p[0])],a2i(p[3]))
}
used:=make([]bool,10)
path:=[]int{}
dfs(0,adjacentTable,used,path)
if !find{
fmt.Println("-")
}
}