本帖最后由 CrLf 于 2015-8-8 15:59 编辑
回复 6# aa77dd@163.com
是这个思路,例:- 'ArrayShift.vbs
- Dim arrStr, sInfo
-
- arrStr = Split("0,1,2,3,4,5,6,7,8,9,10,11,12", ",")
-
- sInfo = "原字符串:" & Join(arrStr, ",") & vbCrLf
-
- For i = -20 To 20
- sInfo = sInfo & "偏移+" & i & ":" & Join(ArrayShift(arrStr, i), ",") & vbCrLf
- Next
-
- WSH.Echo sInfo
-
- Function ArrayShift(ByVal arrStr, ByVal nShift)
- Dim arr, nLength, i, s1, s, nOffSet, [起始]
-
- nLength = UBound(arrStr) + 1
- nShift = (nShift Mod nLength + nLength) Mod nLength
-
- For [起始] = 0 To [func最大公约数](nLength,nShift) - 1
- i = (([起始] + nShift) Mod (nLength))
- tmpStr = arrStr(i)
-
- Do While i <> [起始]
- nOffSet = ((i + nShift) Mod (nLength))
- arrStr(i) = arrStr(nOffSet)
- i = nOffSet
- Loop
-
- arrStr(nOffSet) = tmpStr
- Next
-
- ArrayShift = arrStr
- End Function
-
- Function [func最大公约数](ByVal a,ByVal b)
- Dim c
-
- If b=0 Then a=0
-
- Do While b <> 0
- c = a Mod b
- a = b
- b = c
- Loop
-
- [func最大公约数] = a
- End Function
复制代码 代码逻辑:闭环遍历置换,头尾相衔,回到原点时 +1 继续,一直循环到次数不小于元素个数
如此可实现单表无冗余置换,时间复杂度和空间复杂度比较均衡
事实上顶楼是三数组,因为还要算上函数返回值,如果不想设置临时变量,可以直接使用返回值进行映射,省得最后还要传递一次变量
其实我想说的是,楼主还是投奔 JS 党吧...非 VBS 不娶的话,用 wsf 或者 hta 纳个妾也好啊 |