[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
本帖最后由 aa77dd@163.com 于 2015-8-8 00:15 编辑

只适用于元素全是 1 位数的
  1. Dim arrStr
  2. arrStr = Split("0,1,2,3,4,5,6,7,8,9", ",")
  3. offs = -10086
  4. slen = len(join(arrStr, ""))
  5. msgbox "原字符串:" & Join(arrStr, ",") & vbCrLf _
  6. & "偏移" & offs & ":" & _
  7. join(split(mid(join(arrStr, ";") & ";" & join(arrStr, ";"), 2*(1 + (offs mod slen + slen) mod slen)-1, 2*slen-1), ";"), ",")
复制代码
通用的
算法在时间和空间消耗上是矛盾的, 以时间换空间:
  1. 'ArrShift.vbs
  2. Dim arrStr, sInfo
  3. arrStr = Split("0,1,2,3,4,5,6,7,8,9", ",")
  4. sInfo = "原字符串:" & Join(arrStr, ",") & vbCrLf
  5. sInfo = sInfo & "偏移+2:" & Join(ArrShift(arrStr, 2), ",") & vbCrLf
  6. sInfo = sInfo & "偏移-2:" & Join(ArrShift(arrStr, -2), ",") & vbCrLf
  7. sInfo = sInfo & "偏移+10086:" & Join(ArrShift(arrStr, 10086), ",") & vbCrLf
  8. sInfo = sInfo & "偏移-10086:" & Join(ArrShift(arrStr, -10086), ",") & vbCrLf
  9. MsgBox sInfo
  10. Function ArrShift(ByVal arrStr, ByVal nShift)
  11.   Dim i, t, a_len, tmp
  12.   a_len = UBound(arrStr) + 1
  13.   rem nShift 去符号
  14.   nShift = (nShift mod a_len + a_len)
  15.   for t = 1 to nShift step 1
  16.       tmp = arrStr(0)
  17.       For i = 0 To UBound(arrStr) - 1 Step 1
  18.         arrStr(i) = arrStr( i + 1 )
  19.       next
  20.       arrStr(UBound(arrStr)) = tmp
  21.   next
  22.   ArrShift = arrStr
  23. End Function
复制代码
1

评分人数

    • yu2n: 乐于助人技术 + 1

TOP

回复 5# CrLf

数组索引:
0 1 2 3 4 5
shift = 2
不能 一次性 闭环遍历:
0,2,4,0

数组索引:
0 1 2 3 4 5 6
shift = 2 可以 一次性 闭环遍历:
0,2,4,6,1,3,5,0

shift = 3 可以 一次性 闭环遍历:
0,3,6,2,5,1,4,0


数组索引:
0 1 2 3 4 5 6 7 0=8 1=9
shift = 3 可以 一次性 闭环遍历
0,3,6,1,4,7,2,5,0

数组索引:
0 1 2 3 4 5 6 7 8 0=9
shift = 3 不能 一次性 闭环遍历
0,3,6,0

设 shift > 1
数组长度为 length
情形 A.
length mod shift == 0  不能 一次性 闭环遍历
情形 B.
(length + 1) mod shift == 0 <==> length mod shift == shift - 1  可以 一次性 闭环遍历
还有另外的情形需要迭代深入研究

情形 A 时, 需要额外的代码
可以用 shift ( 链头: 0 .. shift-1 ) 轮置换链:

例如:
数组索引:
0 1 2 3 4 5 6 7 8 0=9
shift = 3 不能 一次性 闭环遍历, 但 用 3 轮置换链即可完成:
0,3,6,0
1,4,7,1
2,5,8,2

每轮置换链闭环时, 才能释放临时变量. 否则将需要更多临时变量保存链头信息.

TOP

回复 9# yu2n

那个算法其实很简单:
原数据:
0123456789 克隆一个接起来  01234567890123456789
偏移 3 位:
01234567890123456789红色部分就是要的结果

CrLf 的算法思路我很久以前就琢磨过, 但只停留在上面我分析的那样, 他的代码做了一个范围内的实证(我并没有运行)

那个算法核心已经成为数学问题了, 而数学里核心又是 余数, 约数, 倍数, 整除, 迭代 这些了.

对于 最大公约数 , 我的思路也没有完全厘清, 只能表示未理解, 无法有更多评论了

TOP

回复 12# CrLf

我后来已经弄清楚了, 你的算法也是对的, 只需一轮循环置换就完全可以,

用不必要的多轮置换, 是很早以前就弄过的, 但当时没有深究能不能 一轮循环置换

到今天, 我差不多又忘了 怎样证明 一轮循环置换 是可行的了, 只是记得在脑袋里确实已经证明过一次了(和你的描述语言不一样,但我们都明白自己的语言), 哈哈哈哈

TOP

返回列表