You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从整数区间集合中移除指定元素的Go语言实现问题求助

问题排查与代码修正

首先,我们来分析你当前代码存在的核心问题:

主要问题点

  1. 计数器未重置:counter变量在所有拆分点循环外声明,导致处理后续拆分点时,会跳过前面的区间,最终因计数器超出区间长度而完全跳过处理。
  2. 未完整遍历区间:找到包含拆分点的区间后直接跳出循环,导致该区间之后的所有区间都无法被添加到结果中。
  3. 结果集修改逻辑错误:通过追加和部分删除的方式修改结果集,容易出现数据丢失或重复的问题,而非重新构建完整的结果区间集合。
  4. 不必要的breakCount变量:该变量的存在增加了逻辑复杂度,且容易引发错误的结果集修改操作。

修正思路

正确的做法应该是针对每个拆分点,重新构建完整的区间集合:

  • 遍历当前所有区间,对每个区间判断是否包含拆分点。
  • 若不包含,则直接保留该区间;若包含,则拆分该区间并保留拆分后的有效部分。
  • 用新构建的区间集合替换当前集合,进入下一个拆分点的处理。

修正后的完整代码

package main

import "fmt"

type intRange struct {
	start int
	end   int
}

// 判断数字是否在区间内
func (s intRange) in(i int) bool {
	return s.start <= i && i <= s.end
}

// 根据指定数字拆分区间,返回拆分后的有效区间
func (s intRange) split(i int) []intRange {
	result := []intRange{}
	// 单个元素且等于拆分点,返回空(移除该元素)
	if s.start == s.end {
		return result
	} else if s.start == i {
		// 拆分点是区间起始,返回起始+1到原结束的区间
		result = append(result, intRange{start: s.start + 1, end: s.end})
	} else if s.end == i {
		// 拆分点是区间结束,返回原起始到结束-1的区间
		result = append(result, intRange{start: s.start, end: s.end - 1})
	} else {
		// 拆分点在区间中间,拆分为左右两个区间
		left := intRange{start: s.start, end: i - 1}
		right := intRange{start: i + 1, end: s.end}
		result = append(result, left, right)
	}
	return result
}

func main() {
	splitPoints := []int{22, 23, 24, 3689}
	// 正确初始化有序区间集合
	sortedArray := []intRange{
		{start: 1, end: 1},
		{start: 2, end: 7},
		{start: 9, end: 5500},
	}

	currentRanges := sortedArray

	// 逐个处理每个拆分点
	for _, sp := range splitPoints {
		var updatedRanges []intRange
		for _, r := range currentRanges {
			if r.in(sp) {
				// 拆分区间并添加所有有效部分
				splitParts := r.split(sp)
				updatedRanges = append(updatedRanges, splitParts...)
			} else {
				// 不包含拆分点,直接保留原区间
				updatedRanges = append(updatedRanges, r)
			}
		}
		// 更新当前区间集合为处理后的结果
		currentRanges = updatedRanges
	}

	// 打印最终结果
	fmt.Println("Final split range:")
	for _, r := range currentRanges {
		if r.start == r.end {
			fmt.Printf("%d ", r.start)
		} else {
			fmt.Printf("%d-%d ", r.start, r.end)
		}
	}
	// 输出:1 2-7 9-21 25-3688 3690-5500
}

代码说明

  1. split方法优化:改为值接收器,避免修改原区间实例,逻辑更安全。
  2. 主逻辑简化:每个拆分点都重新构建区间集合,确保所有区间都被正确处理。
  3. 正确性保障:遍历所有区间,不会遗漏任何需要处理的部分,也不会重复添加或删除区间。

运行修正后的代码,将得到你期望的输出结果:[1, 2-7, 9-21, 25-3688, 3690-5500]。

内容的提问来源于stack exchange,提问作者ricizawu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 04:27:44