-->

c#编号自动生成,取中间没有使用的编号

2019-01-02 21:46发布

问题:

序号生成:从1到1000,其中已使用了部分序号,存在不连续的,如目前是1,2,3,7,12,13,22,31,53,121,221,671,998,现需要获取一个新的编号,只要没被使用即可,求最优算法?

回答1:

 public class No
        {
            public int Number { get; set; }
            public bool IsUsed { get; set; } = false;
        }

        public List<No> NoManage()
        {
            List<No> _list = new List<No>();
            for (int i = 1; i <= 1000; i++)
            {
                No no = new No();
                no.Number = i;
                _list.Add(no);
            }
            return _list;
        }

        public No GetNoUsed(List<No> _list)
        {
            return _list.Where(o => !o.IsUsed).SingleOrDefault();
        }


回答2:

1,2,3,7,12,13,22,31,53,121,221,671,998,现需要获取一个新的编号,只要没被使用即可,求最优算法?

释放的时候 存起来 到时候直接取出来用。



回答3:

我写过,但估计不是最优的,同求



回答4:

bitmap

构建长度1k的bool数组,对已有数据遍历同时对对应偏移量的bool数组元素设为true,以后拿取时只需遍历bool数组找到第一个为false的的偏移量加1就是你的编号



回答5:

看了上面的方法,还是有必改进的空间。

这个问题从本质上讲就是一个排序问题,向上面贫民窟大侠回的就用了两次排序解决问题的。而且还封装了对象,有点繁琐。

我的方法是:

1、定义1000大小的数组list[1000],全部赋值为0;

2、取值时:int index=list.IndexOf(0);

3、释放时:list[index]=0;

如上,不需要任何查询或复杂逻辑就可以实现这个功能了。

另外,我的这个方法中我留了一个Bug希望你能看出来哦。不谢!



标签: