-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy path1700-NumberOfStudentsUnableToEatLunch.go
More file actions
105 lines (93 loc) · 5.04 KB
/
1700-NumberOfStudentsUnableToEatLunch.go
File metadata and controls
105 lines (93 loc) · 5.04 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
package main
// 1700. Number of Students Unable to Eat Lunch
// The school cafeteria offers circular and square sandwiches at lunch break, referred to by numbers 0 and 1 respectively.
// All students stand in a queue. Each student either prefers square or circular sandwiches.
// The number of sandwiches in the cafeteria is equal to the number of students.
// The sandwiches are placed in a stack. At each step:
// If the student at the front of the queue prefers the sandwich on the top of the stack, they will take it and leave the queue.
// Otherwise, they will leave it and go to the queue's end.
// This continues until none of the queue students want to take the top sandwich and are thus unable to eat.
// You are given two integer arrays students and sandwiches where sandwiches[i] is the type of the ith sandwich in the stack (i = 0 is the top of the stack)
// and students[j] is the preference of the jth student in the initial queue (j = 0 is the front of the queue).
// Return the number of students that are unable to eat.
// Example 1:
// Input: students = [1,1,0,0], sandwiches = [0,1,0,1]
// Output: 0
// Explanation:
// - Front student leaves the top sandwich and returns to the end of the line making students = [1,0,0,1].
// - Front student leaves the top sandwich and returns to the end of the line making students = [0,0,1,1].
// - Front student takes the top sandwich and leaves the line making students = [0,1,1] and sandwiches = [1,0,1].
// - Front student leaves the top sandwich and returns to the end of the line making students = [1,1,0].
// - Front student takes the top sandwich and leaves the line making students = [1,0] and sandwiches = [0,1].
// - Front student leaves the top sandwich and returns to the end of the line making students = [0,1].
// - Front student takes the top sandwich and leaves the line making students = [1] and sandwiches = [1].
// - Front student takes the top sandwich and leaves the line making students = [] and sandwiches = [].
// Hence all students are able to eat.
// Example 2:
// Input: students = [1,1,1,0,0,1], sandwiches = [1,0,0,0,1,1]
// Output: 3
// Constraints:
// 1 <= students.length, sandwiches.length <= 100
// students.length == sandwiches.length
// sandwiches[i] is 0 or 1.
// students[i] is 0 or 1.
import "fmt"
func countStudents(students []int, sandwiches []int) int {
// 统计出喜欢 circular 0 and square 1 sandwiches 的学生数量
hash := make(map[int]int, 2)
for _, v := range students {
hash[v]++
}
// 发放 sandwiches
for _, v := range sandwiches {
// sandwiches 发放顺序不能变,喜欢该类型的三明治的学生没有了
// 返回喜欢其它类型 v^1 的学生数量即可
if hash[v] == 0 {
// fmt.Printf("v = %v, v^1 = %v \n",v, v^1)
return hash[v^1]
}
hash[v]--
}
return 0
}
// 用数组来替代 map
func countStudents1(students []int, sandwiches []int) int {
// 统计出喜欢 circular 0 and square 1 sandwiches 的学生数量
arr := []int{0,0}
for _, v := range students {
arr[v]++
}
// 发放 sandwiches
for _, v := range sandwiches {
// sandwiches 发放顺序不能变,喜欢该类型的三明治的学生没有了
// 返回喜欢其它类型 v^1 的学生数量即可
if arr[v] == 0 {
// fmt.Printf("v = %v, v^1 = %v \n",v, v^1)
return arr[v^1]
}
arr[v]--
}
return 0
}
func main() {
// - Front student leaves the top sandwich and returns to the end of the line making students = [1,0,0,1].
// - Front student leaves the top sandwich and returns to the end of the line making students = [0,0,1,1].
// - Front student takes the top sandwich and leaves the line making students = [0,1,1] and sandwiches = [1,0,1].
// - Front student leaves the top sandwich and returns to the end of the line making students = [1,1,0].
// - Front student takes the top sandwich and leaves the line making students = [1,0] and sandwiches = [0,1].
// - Front student leaves the top sandwich and returns to the end of the line making students = [0,1].
// - Front student takes the top sandwich and leaves the line making students = [1] and sandwiches = [1].
// - Front student takes the top sandwich and leaves the line making students = [] and sandwiches = [].
// Hence all students are able to eat.
fmt.Println(countStudents([]int{1,1,0,0},[]int{0,1,0,1})) // 0
// students=[1,1,1,0,0,1] sandwiches=[1,0,0,0,1,1]
// students=[1,1,0,0,1] sandwiches=[0,0,0,1,1]
// students=[1,0,0,1,1] sandwiches=[0,0,0,1,1]
// students=[0,0,1,1,1] sandwiches=[0,0,0,1,1]
// students=[0,1,1,1] sandwiches=[0,0,1,1]
// students=[1,1,1] sandwiches=[0,1,1]
// res = len(students)
fmt.Println(countStudents([]int{1,1,1,0,0,1},[]int{1,0,0,0,1,1})) // 3
fmt.Println(countStudents1([]int{1,1,0,0},[]int{0,1,0,1})) // 0
fmt.Println(countStudents1([]int{1,1,1,0,0,1},[]int{1,0,0,0,1,1})) // 3
}