牛客 2024 【牛客赛文X】春招冲刺 ONT73 体育课测验(二) 【中等 图/拓扑排序 Java,Go,PHP】

题目

在这里插入图片描述题目链接:
https://www.nowcoder.com/practice/64a4c026b2aa4411984f560deec36323

思路

图,BFS,队列

参考答案Java

import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param numProject int整型
     * @param groups int整型ArrayList<ArrayList<>>
     * @return int整型ArrayList
     */
    public ArrayList<Integer> findOrder (int numProject,
                                         ArrayList<ArrayList<Integer>> groups) {
        //map表示图
        Map<Integer, Gnode> graph = new HashMap<>();
        for (int i = 0; i < numProject ; i++) {
            graph.put(i, new Gnode(i));
        }

        for (ArrayList<Integer> group :
                groups) { //xxxf代表 开始节点  xxxt代表  f的邻居
            int vf = group.get(1);
            int vt = group.get(0);
            Gnode nodef = graph.get(vf);
            Gnode nodet = graph.get(vt);

            nodet.in++;
            nodef.nexts.add(nodet);
        }

        Queue<Gnode> q0 = new LinkedList<>();
        Set<Integer> set = new HashSet<>();
        for (Integer v : graph.keySet()) {
            if (graph.get(v).in == 0) {
                q0.add(graph.get(v));
                set.add(v);
            }
        }

        ArrayList<Integer> ll = new ArrayList<>();

        while (!q0.isEmpty()) {
            int size = q0.size();
            for (int i = 0; i < size ; i++) {
                Gnode cur = q0.poll();
                ll.add(cur.data);


                for (Gnode next : cur.nexts) {
                    if (set.contains(next.data)) {
                        return new ArrayList<>();//出现环了,直接返回空的ArrayList
                    }

                    if (--next.in == 0) {
                        q0.add(next);
                        set.add(next.data);
                    }
                }
            }
        }

        return ll.size() == numProject ? ll : new ArrayList<>();
    }

    static class Gnode {
        int in;
        int data;
        List<Gnode> nexts;
        public Gnode(int d) {
            data = d;
            in = 0;
            nexts =  new ArrayList<>();
        }
    }
}

参考答案Go

package main

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 *
 * @param numProject int整型
 * @param groups int整型二维数组
 * @return int整型一维数组
 */
func findOrder(numProject int, groups [][]int) []int {
		// map表示图
	graph := map[int]*Gnode{}

	for i := 0; i < numProject; i++ {
		graph[i] = &Gnode{i, 0, []*Gnode{}}
	}

	for _, gp := range groups {
		vf := gp[1] //出发
		vt := gp[0] //到达

		nodef := graph[vf]
		nodet := graph[vt]

		nodef.nexts = append(nodef.nexts, nodet) //增加邻居
		nodet.in++                               //入度+1
	}

	q0 := []*Gnode{} //Go中队列用切片来表示
	set := map[int]bool{}
	for _, v1 := range graph {
		if v1.in == 0 {
			q0 = append(q0, v1)
			set[v1.data] = true
		}
	}

	ll := []int{}
	for len(q0) > 0 {
		size := len(q0)
		q0bak := []*Gnode{}
		for i := 0; i < size; i++ {
			cur := q0[i]
			//_,ok:=set[cur.data]

			ll = append(ll, cur.data)
			for _, next := range cur.nexts {
				next.in--
				if next.in == 0 {
					_, ok := set[next.data]
					if ok {
						return []int{}
					}

					q0bak = append(q0bak, next)
					set[next.data] = true
				}
			}
		}
		q0 = q0bak
	}

	if len(ll) == numProject {
		return ll
	}

	return []int{}
}

type Gnode struct { //图的节点
	data  int
	in    int
	nexts []*Gnode
}

参考答案PHP

<?php


/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param numProject int整型 
 * @param groups int整型二维数组 
 * @return int整型一维数组
 */
function findOrder( $numProject ,  $groups )
{
    // 图用map表示,PHP中数组是万能,数组也是java中的map,set,list
    $graph = array();
    for($i=0;$i<$numProject;$i++){
        $graph[$i] =  new Gnode($i);
    }


    foreach ($groups as $v){
        $vt= $v[0];
        $vf =$v[1];

        $nodet = $graph[$vt]; //出发节点
        $nodef = $graph[$vf]; //到达节点,也就是出发节点的邻居
        $nodet->in++;
        
        array_push( $nodef->nexts,$nodet);
 
    }

    //BFS
    $q0 = [];
    $set =[];

    foreach ($graph as $node){
        if($node -> in ==0){
            $q0[count($q0)] = $node; //放进入度为0的队列
            $set[$node->data] = $node->data; //访问过该节点了
        }
    }

    $ll = [];
    while (count($q0) >0){
        $size = count($q0);
        $q0bak = [];

        for($i=0;$i<$size;$i++){
            $cur =$q0[$i];
            $ll[count($ll)] = $cur->data;

            foreach ($cur->nexts as $next){
                $next->in--;
               if($next->in ==0){
                   if(isset($set[$next->data])){
                       return []; //出现环了
                   }

                   $q0bak[count($q0bak)] = $next;
                   $set[$next->data] = $next->data;
               }

            }
        }
        $q0 =$q0bak;
    }

    if(count($ll) == $numProject){
        return $ll;
    }
    return [];
}

class Gnode{
    public $in;
    public $data;
    public $nexts;

    public function __construct($d)
    {
        $this->data = $d;
        $this->in =0;
        $this->nexts = [];
    }

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/551928.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Linux--多线程】

1 . Linux线程概念 1.1 什么是线程 在一个程序里的一个执行路线就叫做线程&#xff08;thread&#xff09;。更准确的定义是&#xff1a;线程是“一个进程内部的控制序列” 一切进程至少都有一个执行线程 线程在进程内部执行&#xff0c;本质是在进程地址空间内运行 Linux系…

北京InfoComm展推出500款新品,覆盖30个市场,助力行业未来

【2024年4月17日——北京讯】亚太区首屈一指的专业视听和集成体验解决方案展北京InfoComm China 2024 今天在北京的国家会议中心 (CNCC) 盛大开幕&#xff0c;展开为期三天的商贸展会和高峰会议。作为行业产品发布的首要平台&#xff0c;北京InfoComm China吸引众多展商携新品推…

代码随想录阅读笔记-回溯【重新安排行程】

题目 给定一个机票的字符串二维数组 [from, to]&#xff0c;子数组中的两个成员分别表示飞机出发和降落的机场地点&#xff0c;对该行程进行重新规划排序。所有这些机票都属于一个从 JFK&#xff08;肯尼迪国际机场&#xff09;出发的先生&#xff0c;所以该行程必须从 JFK 开…

claude国内不能用

AnthropicAI 公司旗下的Claude 3 大型语言模型&#xff0c;以其卓越的性能直接挑战了GPT-4的市场地位。Claude 3 系列中包含了几个不同版本&#xff0c;如Claude 3 Opus、Claude 3 Sonnet 以及 Claude 3 Haiku&#xff0c;每个版本都针对特定的应用场景进行了优化。 在这些版本…

一款国产的开发辅助AI插件!

文章目录 一 Comate 介绍二 价格三 安装四 体验4.1 智能推荐4.1.1 单行推荐4.1.2 多行推荐 4.2 智能生成4.2.1 注释生成代码4.2.2 增强生成代码4.2.3 生成单元测试4.2.4 生成代码注释文档注释行间注释 4.3 代码解释4.4 调优建议4.5 长函数拆分 五 智能问答六 其他能力6.1 插件配…

Arduino UNO驱动MPR121接近电容式触摸传感器控制WS2812彩灯

简介 MPR121芯片功能强大可用作触摸,电容检测,驱动LED等等.在低速扫描下可以将功 耗降低到8μA,可以处理多达12个独立的触摸板。支持I2C,几乎可以用任何微控 制器连接。可以使用ADDR引脚选择4个地址中的一个,一个I2C2线总线上共有48 个电容触摸板。使用该芯片比使用模拟输入进行…

全国产化无风扇嵌入式车载电脑农耕车辆/钢厂天车行业应用

农耕车辆行业应用 背景介绍 当前农耕车车载电脑主要的功能&#xff0c;是要实现农耕车的精确的定位和导航&#xff0c;更加先进的系统则要实现农耕车自动驾驶&#xff0c;与农耕车上相关传感器的通讯(例如耕土深度的传感器, 油量存量传感器…)来实现更多的自动化、信息化的功能…

GPT-4最新详解:能力对比,语言,视觉输入,操纵性,聊天GPT Plus等

OpenAI创建了 GPT-4&#xff0c;这是 OpenAI 扩大深度学习努力的最新里程碑。 GPT-4 是一个大型多模态模型&#xff08;接受图像和文本输入&#xff0c;发出文本输出&#xff09;&#xff0c;虽然在许多现实场景中能力不如人类&#xff0c;但在各种专业和学术基准上表现出人类水…

新书速览|Vue.js+Node.js全栈开发实战

掌握Vue.js、Node.js、MySQL全栈开发方法 本书内容 《Vue.jsNode.js全栈开发实战》以掌握Web全栈开发技术为目标&#xff0c;以Node.js和Vue.js原生开发和项目实战为主线&#xff0c;详细介绍Node.js Vue.js全栈开发技术。本书内容丰富、实例典型、实用性强&#xff0c;配套示…

从入门到精通C++之类和对象(续)

目录 初始化列表构造函数&#xff1f;拷贝构造&#xff1f;浅谈explicit关键字友元 内部类static成员总结 初始化列表 引入初始化列表&#xff1a;简化代码&#xff0c;提高效率 在编程中&#xff0c;初始化列表是一种用于在创建对象时初始化成员变量的快捷方式。通过初始化列…

Linux第89步_了解异步通知及其结构和函数

1、了解“异步通知” “异步通知”的核心就是信号。信号是采用软件模拟的“中断”&#xff0c;它由“驱动程序”主动向“应用程序”发送信号&#xff0c;并报告自己可以访问了&#xff0c;“应用程序”收到信号以后&#xff0c;就从“驱动设备”中读取或者写入数据。整个过程就…

电商数据采集的网页抓取数据、淘宝、天猫、京东等平台的电商数据抓取|电商数据API接口网页爬虫、采集网站数据

电商数据采集的网页抓取数据、淘宝、天猫、京东等平台的电商数据抓取&#xff0c;网页爬虫、采集网站数据、网页数据采集软件、python爬虫、HTM网页提取、APP数据抓包、APP数据采集、一站式网站采集技术、BI数据的数据分析、数据标注等成为大数据发展中的热门技术关键词。那么电…

@Scheduled注解简介

一、注解介绍 Scheduled注解是Spring Boot提供的用于定时任务控制的注解&#xff0c;主要用于控制任务在某个指定时间执行&#xff0c;或者每隔一段时间执行。 二、源码 package org.springframework.scheduling.annotation;import java.lang.annotation.Documented; import…

【服务器部署篇】Linux下Nacos安装和配置

作者介绍&#xff1a;本人笔名姑苏老陈&#xff0c;从事JAVA开发工作十多年了&#xff0c;带过大学刚毕业的实习生&#xff0c;也带过技术团队。最近有个朋友的表弟&#xff0c;马上要大学毕业了&#xff0c;想从事JAVA开发工作&#xff0c;但不知道从何处入手。于是&#xff0…

中科国声携新品亮相北京InfoComm China 2024展

4月17日&#xff0c;北京InfoComm China 2024展&#xff08;北京专业视听技术和集成体验解决方案展览会&#xff09;在北京的国家会议中心盛大开幕。展会为期三天。作为备受瞩目的”会议系统国家队“&#xff0c;中科国声携众多优质会议音频产品及全新会议系统解决方案精彩亮相…

贪心算法简介

目录 一、什么是贪心算法&#xff1f; 二、贪心算法的特点 三、贪心算法解决找零问题、最短路径问题、背包问题 1.找零问题 2.最短路径问题 3.背包问题 一、什么是贪心算法&#xff1f; 贪心算法就是希望通过局部最优来解决全局最优 基本步骤&#xff1a;1.将问题分为若…

「每日跟读」英语常用句型公式 第14篇

「每日跟读」英语常用句型公式 第14篇 1. As far as __ is concerned 就__ 而言 As far as the project timeline is concerned, we’re running ahead of schedule. &#xff08;就项目时间表而言&#xff0c;我们进度超前了。&#xff09; As far as the exam results ar…

第20天:信息打点-红蓝队自动化项目资产侦察企查产权武器库部署网络空间

第二十天 一、工具项目-红蓝队&自动化部署 自动化-武器库部署-F8x 项目地址&#xff1a;https://github.com/ffffffff0x/f8x 介绍&#xff1a;一款红/蓝队环境自动化部署工具,支持多种场景,渗透,开发,代理环境,服务可选项等.下载&#xff1a;wget -O f8x https://f8x.io…

Oracle执行计划优化SPM案例

1.现象 执行下面这段代码&#xff0c;发现子库存表走了全表扫描 SELECT msi.secondary_inventory_name, --子库存msi.description --库存说明FROM inv.mtl_secondary_inventories msi,csi_item_instances ciiWHERE msi.secondary_inventory_name cii.inv_subinve…

Matlab拟合常见错误解决 |分段微分方程组拟合【源码+教程】

专栏导读 作者简介&#xff1a;工学博士&#xff0c;高级工程师&#xff0c;专注于工业软件算法研究本文已收录于专栏&#xff1a;《复杂函数拟合案例分享》本专栏旨在提供 1.以案例的形式讲解各类复杂函数拟合的程序实现方法&#xff0c;并提供所有案例完整源码&#xff1b;2.…