题目
有N个人围成一圈,顺序排号,从第一个人开始报数(从1到3报数),凡是报到3的人退出圈子,
问最后留下来的是第几号的那位
分析
遇到的一个好玩的题目,记录一下,C写的代码我还没有编译,大致思路是没错的。js我用的递归的方式,当然时间复杂度就比C的时间复杂度高多了。
代码
const getPostion = array => {
if (array.length === 1) return array[0] // 一个人
if (array.length === 2) return array[1] // 两个人
return getPostion(array.filter((item, index) => index % 3))
}
const testArray = ['小明', '小张', '小王', '小董', '小陈', '小孙', '小江', '小红', '小涛', '小张', '小王', '小董', '小陈', '小孙', '小江',
'小红', '小涛', '小张', '小王', '小董', '小陈', '小孙', '小江', '小红', '小涛', '小张', '小王', '小董', '小陈', '小孙', '小江', '小红',
'小涛', '小张', '小王', '小董', '小陈', '小孙', '小江', '小红', '小涛', '小张', '小王', '小董', '小陈', '小孙', '小江', '小红', '小涛'
]
// 生成内容递增的数组
const indexArray = Array.from(Array(testArray.length)).map((v, i) => i)
const pos = getPostion(indexArray)
console.log(`剩下的是第${pos+1}位:${testArray[pos]}`)
// 注:
// 用C语言 可用循环单链表达到效率最大化
// 无需额外空间,一次while循环即可得结果
// while (p->next) {
// s = p->next->next
// p->next->next = p->next->next->next
// free(s)
// p=p->next->next
// }