原题: 一副从1到n的牌,每次从牌堆顶取一张放桌子上,再取一张放牌堆底,直到手机没牌,最后桌子上的牌是从1到n有序,设计程序,输入n,输出牌堆的顺序数组 。
微软君给的算法: 取一个1~n的数组,这里为了说明取n=5。按照题目中的规则变换,得到数组:[1 3 5 4 2],将该数组下标与值互换得到[1 5 2 4 3],即为答案。解释:[1 3 5 4 2]的意义是,经过变换,原数组中3号位置的数字现在2号槽,原数组中5号位置的数字现在3号槽... 现在已知变换后的槽存放的是1~n,故只需将下标与值互换即可得到待求数组。
# julia代码 变相约瑟夫环。知乎上一个小米面试题的微软解法(细节去知乎找找看)# 用数字构成顺序数组function make_array(n) array = Int32[] for i = 1:n push!(array, i) end return arrayend# 构造中间数组,取一个结尾存一个function count_mid_array(array) mid_array = Int32[] while length(array) > 1 # 长度大于1 t1 = splice!(array, 1) # 删除首个 push!(mid_array, t1) # 插入中间组 t2 = splice!(array, 1) # 再删除首个 push!(array, t2) # 插入原组结尾 end push!(mid_array, array[1]) # 最后剩下那个插入中间组 return mid_arrayend# 将中间数组 转换为 结果数组function trans_array(n, new_array) fin_array = Int32[] for i = 1:n idx = 0 # 我不知道julia的同时返回元素值和索引的方法,就自己构造索引了 for a in new_array idx+=1 # 索引增值 if i == a push!(fin_array, idx) # 提取索引 end end end return fin_arrayend# 测试方法入口function joseph() n = 12 sou = make_array(n) println(sou) mid = count_mid_array(sou) println(mid) fin = trans_array(n, mid) println(fin)endjoseph()