|
本帖最后由 香川群子 于 2013-11-1 12:39 编辑
时间测试代码运行结果:
上班使用老电脑 家里老电脑
1.60GHz 512MB
100,000 5.316406
69,000 2.742188 秒 1.687500 秒
48,000 1.429688 秒 0.953125 秒
呵呵,我的机器弱爆了……但我的代码好啊,跑起来照样很快。
11/01修改,按竞赛要求的函数是:
- Function MinRot(ByVal sStr As String) As Long
- Dim t#, i&, j&, k&, l&, m&, n&, r&, ii&, jj&, t0$, t1$, t2$, tt$, sStr2$
- t = Timer
-
- For i = 1 To 26
- t0 = Chr(i + 96)
- j = InStr(sStr, t0): If j Then m = j: n = i: Exit For '找到最先出现的最小字符位置
- Next
- l = Len(sStr)
- If String(l, t0) = sStr Then
- MinRot = 0 '如字符串由同一最小字符组成则结果=0,直接退出 (10/31修改)
- Else
- sStr2 = sStr & sStr '待检字符
- r = l '最小字符的最大重复值初始化
- For ii = n + 1 To 26 '遍历检查其它字符
- jj = InStr(j, sStr2, Chr(ii + 96))
- If jj Then If jj - j < r Then r = jj - j '找到最小的即第一个其它字符位置
- Next
- t1 = Mid(sStr2, m, r)
- '以上为检查获取最小字符的最大重复值(11/01新添加)
-
- For i = r + 1 To l '遍历检查
- j = m: k = 1: t2 = Mid(sStr2, j, i) '每次增加1个字符来检查
- Do
- j = InStr(j + i, sStr2, t1)
- '找到下一个前面相同的字符位置,需排除以截取字符位置改为j+i (10/31修改)
- If j > l Or j = 0 Then Exit Do '如已到底或不含最小字符则结束(10/31修改)
-
- tt = Mid(sStr2, j, i) '否则截取相同个数i个字符
- If tt < t2 Then '如字符值更小
- If String(i, t0) = tt Then '如全是最小字符(11/01新添加)
- r = l '最小字符的最大重复值初始化
- For ii = n + 1 To 26
- jj = InStr(j, sStr2, Chr(ii + 96))
- If jj Then If jj - j < r Then r = jj - j '找到最小的即第一个其它字符位置
- Next
- If r > i Then i = r: tt = Mid(sStr2, j, i)
- '如最小字符最大值r比当前i值更大则取最大值
- End If
- '以上新增以快速确定新位置开始是否有更长的相同最小字符(11/01新添加)
-
- t2 = tt: k = 1: m = j '则更新记录并初始化
- ElseIf tt = t2 Then '如相同
- k = k + 1 '则记录相同字符出现次数k
- End If
- Loop
- If k = 1 Then Exit For Else t1 = t2 '如相同字符只有一个就可退出,否则以当前最小字符作为新的检查字符
- Next
- MinRot = m - 1 '减去1得到相对位置(当前位置=0)
- End If
- Debug.Print Space(10)
- Debug.Print "MinRot Code is: " & IIf(tt = "", t1, t2) '输出最小字符
- Debug.Print "MinRot Long is: " & IIf(tt = "", i - 1, i) '输出最小字符长度
- '以上增加输出结果资料,是否违规? 如违规请告知,或直接注释掉
- t = Timer - t
- Debug.Print "ID: " & "<kagawa>"
- Debug.Print "Answer is: " & MinRot
- Debug.Print "Time used: " & Format(t, "0.000s")
- Debug.Print Space(10)
- End Function
复制代码 |
评分
-
1
查看全部评分
-
|