效率算法 如何判断一组数中每个数连续出现几次
比如有这样一组数字1,2,3,4,5
2,3,4,9,10
2,1,3,4,7
9,8,6,5,4
3,2,1,5,6
... ...
怎么判断1,2,3,4,5,6,7,8,9,各连续出现几次,(注意:是连续出现,比如2连续出现了3次,4连续出现了4次)。
我想,用多重循环的土办法,代码可能要写一堆,加上无数的if语句,所以代码写不下去。先问问各位有没有好的速效算法,提供个思路给小弟,不胜感谢! 是这样吗?
$arr = '1,2,3,4,52,3,4,9,102,1,3,4,79,8,6,5,43,2,1,5,6'
For $i = 0 To 9
$RegExp = StringRegExp($arr, '[' & $i & ']', 3, 1)
If Not @error Then MsgBox(64, $i & " 出现的次数为:", UBound($RegExp))
Next
不是很理解你的连续.你的注意让人摸不着头脑. 回复 2# ceoguang
C版不好意思,我再表达一次:
$a=
$b=
$c=
$d=
$e=
这五个数组是连续排下来的,2在$a,$b,$c数组连续出现,1在$a和$c出现,但不是连续出现。
我想问的有没有好的效率算法来确定各个数各连续出现了几次? 我明白你的意思了,但是,你这个依然是可以通过正则来计算的.你没看出规律?
假设你要寻找的数字为2,只是数值在UBound($arr) + 1 内都算是重复出现了对吧?不对,这里又生出多一个新问题.假如$arr的数值为,这里1算是重复吗? 回复 3# papapa314
这题有点意思,来个笨办法
#include <array.au3>
Local $a=,$b=,$c=,$d=,$e=
_ArrayConcatenate($a,$b)
_ArrayConcatenate($a,$c)
_ArrayConcatenate($a,$d)
_ArrayConcatenate($a,$e)
$u=_ArrayUnique($a)
_ArrayDelete($u,0)
Local $fin
For $i=0 To UBound($u)-1
$fin[$i]=$u[$i]
$fin[$i]=1
Next
Local $temp
For $i=0 To UBound($a)-1
$temp[$i]=$a[$i]
$temp[$i]=Int($i/5)+1
Next
_ArraySort($temp)
Local $k=0
For $n=0 To UBound($u)-1
$array_new=_ArrayFindAll($temp,$u[$n])
If UBound($array_new)>1 Then
Local $array_temp
For $i=0 To UBound($array_new)-1
$array_temp[$i]=$temp[$array_new[$i]]
$array_temp[$i]=$temp[$array_new[$i]]
Next
_ArraySort($array_temp,0,0,0,1)
Local $num=2
For $i=1 To UBound($array_temp)-1
If $array_temp[$i]=$array_temp[$i-1]+1 Then
$fin[$k]=$array_temp[$i]
$fin[$k]=$num
$num+=1
EndIf
Next
Else
$fin[$k]=$u[$n]
$fin[$k]=1
EndIf
$k+=1
Next
_ArrayDisplay($fin) 本帖最后由 papapa314 于 2011-2-14 00:32 编辑
回复 5# 3mile
谢谢3mile大哥,我昨晚想了一个晚上,终于想到一个比较好的方法了,可以支持更多连续排列下来的数组,代码也很简单。希望大家给提提意见!!附件是刚从网上找来的数据制作成ini文件,用来读取数组的。#include <WindowsConstants.au3>
#include <array.au3>
$total=IniReadSection(@ScriptDir&"\test.ini","测试");得到每行数字所组成的数组
For $v=1 To 49
Dim $period
Dim $t=0;存储单独出现的次数
Dim $j=0,$value;存储包含出现数字信息的新数组
For $i=0 To 30
;分割每行数字为一个数组
$period[$i]=StringSplit($total[$i],",")
;遍历数组,查找是否包含指定数字
If _ArraySearch($period[$i],$v,1)>0 Then
$t+=1 ;得到单独出现的次数$t
EndIf
;由于$period[$i]中第一个元素固定等于数组长度,所以从第二个元素开始查找
If _ArraySearch($period[$i],$v,1)>0 Then
$value[$j]=1;如果存在,就给$value1[$j]赋值1
$j+=1
EndIf
If _ArraySearch($period[$i],$v,1)=-1 Then
$value[$j]=0;如果不存在,就给$value1[$j]赋值0
$j+=1
EndIf
;这时候就得到了一个包含出现数字信息的数组$value
Next
$a=StringReplace(_ArrayToString($value),"|","")
$b=StringSplit($a,"0");得到一个类似二进制的代码
Dim $two=0,$three=0,$four=0,$five=0
For $p=1 To UBound($b)-1
If $b[$p]="11" Then
$two+=1
EndIf
If $b[$p]="111" Then
$three+=1
EndIf
If $b[$p]="1111" Then
$four+=1
EndIf
If $b[$p]="11111" Then
$five+=1
EndIf
Next
MsgBox(0,"","数字"&$v&"总出现次数为"&$t&",连续出现两次的有"&$two&"次;连续出现三次的有"&$three&"次;连续出现四次的有"&$four&"次,连续出现五次的有"&$five&"次")
Next
回复 4# ceoguang
谢谢C版,想到一个方法了,希望给提提意见。
页:
[1]