猿问

数据排序问题

有一个排序需求,需要实现:当前数据往后移动N位或者向前移动N位。想了半天,没想到好的解决办法。

操作对象是数据库一条数据

希望能在损耗最少的情况下,实现


撒科打诨
浏览 549回答 1
1回答

RISEBY

核心思想是将数组依据原始位置和新位置”切割“成几部分,调整位置后重新合并,不涉及排序。并且,我给的方案能左移也能右移动。PS. 看到题目变更,目标是数据库,欲哭无泪!var&nbsp;arr&nbsp;=&nbsp;[0,&nbsp;1,&nbsp;2,&nbsp;3,&nbsp;4,&nbsp;5,&nbsp;6,&nbsp;7,&nbsp;8,&nbsp;9];/** i:&nbsp;目标元素的index steps:&nbsp;移动步数,正数向右移动,负数向左移动 inArray:&nbsp;目标数组 */function&nbsp;moveStepsInArray(i,&nbsp;steps,&nbsp;inArray)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;if(i<0&nbsp;||&nbsp;i>inArray.length&nbsp;-&nbsp;1&nbsp;||&nbsp;steps&nbsp;===&nbsp;0)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;inArray; &nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;newPosition&nbsp;=&nbsp;i&nbsp;+&nbsp;steps;&nbsp;&nbsp;&nbsp;&nbsp;if(newPosition&nbsp;<&nbsp;0)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;newPosition&nbsp;=&nbsp;0; &nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;if(newPosition&nbsp;>&nbsp;inArray.length&nbsp;-&nbsp;1)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;newPosition&nbsp;=&nbsp;inArray.length&nbsp;-&nbsp;1; &nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;front&nbsp;=&nbsp;steps&nbsp;>&nbsp;0&nbsp;?&nbsp;i:&nbsp;newPosition;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;after&nbsp;=&nbsp;steps&nbsp;>&nbsp;0&nbsp;?&nbsp;newPosition:&nbsp;i;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;targetVal&nbsp;=&nbsp;inArray[i];&nbsp;&nbsp;&nbsp;&nbsp;if(steps&nbsp;>&nbsp;0)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;inArray.slice(0,&nbsp;front) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.concat(inArray.slice(front&nbsp;+&nbsp;1,&nbsp;after&nbsp;+&nbsp;1)) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.concat([targetVal]) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.concat(inArray.slice(after&nbsp;+&nbsp;1))&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;if(steps&nbsp;<&nbsp;0)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;inArray.slice(0,&nbsp;front) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.concat([targetVal]) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.concat(inArray.slice(front,&nbsp;after)) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.concat(inArray.slice(after&nbsp;+&nbsp;1)); &nbsp;&nbsp;&nbsp;&nbsp;} } moveStepsInArray(4,&nbsp;-3,&nbsp;arr);&nbsp;//将arr中的第4个元素向左移动3步
随时随地看视频慕课网APP
我要回答