Guest User

Untitled

a guest
Mar 21st, 2018
128
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.30 KB | None | 0 0
  1. package main
  2.  
  3. import (
  4. "fmt"
  5. )
  6.  
  7. func main() {
  8. left := []string{`a`,`b`,`d`,`e`,`f`,`g`,`i`,`j`,`k`}
  9. right := []string{`b`,`c`,`d`,`e`,`h`,`i`,`j`,`k`}
  10.  
  11. res := merge(left, right)
  12.  
  13. fmt.Println(res)
  14. }
  15.  
  16.  
  17. // merge merges left array to right
  18. func merge(left, right []string) []string {
  19. rightIdx := toMap(right)
  20.  
  21. out := make([]string, len(right))
  22. copy(out, right)
  23.  
  24. lastFoundIdx := -1
  25. insertedElementsLen := 0
  26.  
  27. for k, v := range left {
  28. if pos, ok := rightIdx[v]; ok {
  29. // Real position should be increased by length of inserted elements
  30. pos += insertedElementsLen
  31.  
  32. newElementsFromLeft := make([]string, len(left[lastFoundIdx+1:k]))
  33. copy(newElementsFromLeft, left[lastFoundIdx+1:k])
  34.  
  35. out = append(out[:pos], append(newElementsFromLeft, out[pos:]...)...)
  36. insertedElementsLen += len(newElementsFromLeft)
  37. lastFoundIdx = k
  38. }
  39. }
  40.  
  41. // Insert rest elements after last found index
  42. if lastFoundIdx < len(left) {
  43. if lastFoundIdx == -1 {
  44. out = append(out, left...)
  45. } else {
  46. pos := rightIdx[left[lastFoundIdx]] + insertedElementsLen
  47. out = append(out[:pos+1], append(left[lastFoundIdx+1:], out[pos+1:]...)...)
  48. }
  49. }
  50.  
  51. // Drop local deleted elements from out
  52.  
  53. return out
  54. }
  55.  
  56. func toMap(arr []string) map[string]int {
  57. out := map[string]int{}
  58.  
  59. for i, value := range arr {
  60. out[value] = i
  61. }
  62.  
  63. return out
  64. }
Add Comment
Please, Sign In to add comment