👨🏫 5133. 奶牛排队
题目描述
约翰的农场有 n n n 头奶牛,每一头奶牛都有一个正整数编号。
不同奶牛的编号不同。
现在,这 n n n 头牛按某种顺序排成一队,每头牛都拿出一张纸条写下了其前方相邻牛的编号以及其后方相邻牛的编号。
注意:
- 这些奶牛并没有记下自己的编号。
- 位于队首的奶牛前方没有牛,所以它在前方相邻牛处写下的是数字 0 0 0。
- 位于队尾的奶牛后方没有牛,所有它在后方相邻牛处写下的是数字 0 0 0。
将所有奶牛写下的纸条收集起来并打乱顺序后交给你。
你的任务是根据这些纸条信息,推导出完整的奶牛队列。
输入格式
第一行包含整数 n n n,表示奶牛数量。
接下来 n n n 行,每行包含两个整数 a _ i , b _ i a\_i,b\_i a_i,b_i,表示其中一头奶牛写下的其前方相邻牛的编号以及其后方相邻牛的编号。
注意, a _ i a\_i a_i 或 b _ i b\_i b_i 可能为 0 0 0,这表示该奶牛没有前方相邻牛或后方相邻牛。
输出格式
输出共一行, n n n 个整数,按照从前到后的顺序输出队列中每头奶牛的编号。
数据范围
前
5
5
5 个测试点满足
2
≤
n
≤
5
2 \le n \le 5
2≤n≤5。
所有测试点满足
2
l
e
n
≤
2
×
1
0
5
2 \\le n \le 2 \times 10^5
2len≤2×105,
0
≤
a
_
i
,
b
_
i
≤
1
0
6
0 \le a\_i,b\_i \le 10^6
0≤a_i,b_i≤106。文章来源:https://www.toymoban.com/news/detail-633710.html
输入样例:
4
92 31
0 7
31 0
7 141
输出样例:
92 7 31 141
时间复杂度
O(n)
文章来源地址https://www.toymoban.com/news/detail-633710.html
🍺 AC code
import java.util.Scanner;
public class Main
{
static int N = 1000010;
static int[] a = new int[N];
static int[] b = new int[N];
static int[] mp = new int[N];
static int[] cnt = new int[N];// 记录每个数出现的次数,出现在前面 +1,出现在后面 -1
public static void main(String[] args)
{
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int idx = 0;// idx 记录当前牛在 a[i] 时 的下标 i
for (int i = 0; i < n; i++)
{
a[i] = sc.nextInt();
b[i] = sc.nextInt();
cnt[a[i]]++;
cnt[b[i]]--;
mp[a[i]] = i;
if (a[i] == 0)// 说明是第一头牛
idx = i;
}
int val = 0;// val记录当前的值
for (int i = 0; i < N; i++)
if (cnt[i] == 1)
val = i;//
for (int i = 0; i < n; i++)
{
System.out.print(val + " ");
int nextVal = b[idx];// 当前牛的下标 idx 的 b(后一位)
int nextIdx = mp[val];// 找到 (下一头牛的编号 == a[i]) 的 下标 i
val = nextVal;
idx = nextIdx;
}
}
}
到了这里,关于奶牛排队 java 思维题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!