funcgcd(a int, b int)int { n, m := max(a, b), min(a, b) if m == 0 { return n } return gcd(m, n%m) }
funcreplaceNonCoprimes(nums []int) []int { for i := 0; i < len(nums); i++ { if i > 0 { g := gcd(max(nums[i], nums[i-1]), min(nums[i], nums[i-1])) if g > 1 { nums[i] = (nums[i] * nums[i-1]) / g nums = append(nums[:i-1], nums[i:]...) i -= 2 } } } return nums }
funcgcd(a int, b int)int { n, m := max(a, b), min(a, b) if m == 0 { return n } return gcd(m, n%m) }
funcreplaceNonCoprimes(nums []int) []int { for i := 0; i < len(nums); i++ { p := -1 if i > 0 && nums[i-1] > 0 { p = i - 1 } elseif i > 0 { p = i + nums[i-1] } if p >= 0 { g := gcd(max(nums[i], nums[p]), min(nums[i], nums[p])) if g > 1 { nums[i] = (nums[i] * nums[p]) / g1 //先标记为删除 nums[p] = -1 //寻找p的上一个未被删除的元素 p-- if p >= 0 && nums[p] < 0 { p += nums[p] + 1 } //重新计算偏移量 nums[i-1] = p - i i-- } } } var ret = make([]int, 0) for _, n := range nums { if n > 0 { ret = append(ret, n) } } return ret }
funcgcd(a int, b int)int { n, m := max(a, b), min(a, b) if m == 0 { return n } return gcd(m, n%m) }
funcreplaceNonCoprimes(nums []int) []int { var stack = linkedliststack.New() for i := range nums { //不断弹出栈直到栈空或者上一个元素和nums[i]互质 for v, ok := stack.Pop(); ok; v, ok = stack.Pop() { p, _ := v.(int) g := gcd(nums[p], nums[i]) if g > 1 { nums[i] = (nums[i] * nums[p]) / g nums[p] = -1 } else { //若互质(未删除)则重新压入栈 stack.Push(p) break } } //每遍历完一个元素就将其压入栈 stack.Push(i) } var ret = make([]int, 0) for _, n := range nums { if n > 0 { ret = append(ret, n) } } return ret }