华为 5月20日机试题

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("-")
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值