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(); }
这个方案不错
1,2,3,7,12,13,22,31,53,121,221,671,998,现需要获取一个新的编号,只要没被使用即可,求最优算法?
释放的时候 存起来 到时候直接取出来用。
不是最好的方法
@三人成虎: 论速度这个速度是 o(1) 没有任何遍历 等操作。
因为从一个 盘子 拿到另一个盘子 这种操作是最简单最直接的。
论体积这确实不是最好的。
你是要操作数据库的 自增ID么?
我写过,但估计不是最优的,同求
bitmap
构建长度1k的bool数组,对已有数据遍历同时对对应偏移量的bool数组元素设为true,以后拿取时只需遍历bool数组找到第一个为false的的偏移量加1就是你的编号
看了上面的方法,还是有必改进的空间。
这个问题从本质上讲就是一个排序问题,向上面贫民窟大侠回的就用了两次排序解决问题的。而且还封装了对象,有点繁琐。
我的方法是:
1、定义1000大小的数组list[1000],全部赋值为0;
2、取值时:int index=list.IndexOf(0);
3、释放时:list[index]=0;
如上,不需要任何查询或复杂逻辑就可以实现这个功能了。
另外,我的这个方法中我留了一个Bug希望你能看出来哦。不谢!
感谢关注,还没看到更优雅的处理方式。