-
Notifications
You must be signed in to change notification settings - Fork 0
/
MergeOrderedArray.swift
110 lines (83 loc) · 2.83 KB
/
MergeOrderedArray.swift
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
106
107
108
109
110
/*
In order to win the prize for most cookies sold, my friend Alice and I are going to merge our Girl Scout Cookies orders and enter as one unit.
Each order is represented by an "order id" (an integer).
We have our lists of orders sorted numerically already, in arrays. Write a function to merge our arrays of orders into one sorted array.
For example:
let myArray = [3, 4, 6, 10, 11, 15]
let alicesArray = [1, 5, 8, 12, 14, 19]
print(mergeArrays(myArray, alicesArray))
// logs [1, 3, 4, 5, 6, 8, 10, 11, 12, 14, 15, 19]
*/
//My Solution
//I consider that each array has the same amount of elements
//Also consider that each array is already ordered.
func mergeArrays(_ arrayOne:[Int], _ arrayTwo:[Int])->[Int]{
//Base array for result
var mergeArray:[Int] = []
//Which array is the biggest
for num in 0...arrayOne.count-1{
var maxNumber = 0
var minNumber = 0
var pivotNumber = 0
//Get the less of each array
if arrayOne[num] < arrayTwo[num]{
minNumber = arrayOne[num]
maxNumber = arrayTwo[num]
} else {
minNumber = arrayTwo[num]
maxNumber = arrayOne[num]
}
if mergeArray.count == 0 {
mergeArray.append(minNumber)
mergeArray.append(maxNumber)
continue
} else {
pivotNumber = mergeArray[mergeArray.count - 1]
if minNumber < pivotNumber{
mergeArray[mergeArray.count - 1] = minNumber
if maxNumber < pivotNumber {
mergeArray.append(maxNumber)
mergeArray.append(pivotNumber)
} else {
mergeArray.append(pivotNumber)
mergeArray.append(maxNumber)
}
} else {
mergeArray.append(minNumber)
mergeArray.append(maxNumber)
}
}
}
return mergeArray
}
let myArray = [3, 4, 6, 10, 11, 15]
let alicesArray = [1, 5, 8, 12, 14, 19]
print(mergeArrays(myArray, alicesArray))
//Cake Interview solution
func mergeArrays(_ myArray: [Int], _ alicesArray: [Int]) -> [Int] {
// set up our mergedArray
var mergedArray = Array(repeating: 0, count: myArray.count + alicesArray.count)
var currentIndexAlices = 0
var currentIndexMine = 0
var currentIndexMerged = 0
while currentIndexMerged < mergedArray.count {
let isMyArrayExhausted = currentIndexMine >= myArray.count
let isAlicesArrayExhausted = currentIndexAlices >= alicesArray.count
// case: next comes from my array
// my array must not be exhausted, and EITHER:
// 1) alice's array IS exhausted, or
// 2) the current element in my array is less
// than the current element in alice's array
if !isMyArrayExhausted &&
(isAlicesArrayExhausted || myArray[currentIndexMine] < alicesArray[currentIndexAlices]) {
mergedArray[currentIndexMerged] = myArray[currentIndexMine]
currentIndexMine += 1
// case: next comes from alice's array
} else {
mergedArray[currentIndexMerged] = alicesArray[currentIndexAlices]
currentIndexAlices += 1
}
currentIndexMerged += 1
}
return mergedArray
}