papapa314 发表于 2011-2-11 17:01:47

效率算法 如何判断一组数中每个数连续出现几次

比如有这样一组数字
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语句,所以代码写不下去。先问问各位有没有好的速效算法,提供个思路给小弟,不胜感谢!

ceoguang 发表于 2011-2-11 21:40:04

是这样吗?

$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

不是很理解你的连续.你的注意让人摸不着头脑.

papapa314 发表于 2011-2-11 22:05:47

回复 2# ceoguang

C版不好意思,我再表达一次:
$a=
$b=
$c=
$d=
$e=
这五个数组是连续排下来的,2在$a,$b,$c数组连续出现,1在$a和$c出现,但不是连续出现。
我想问的有没有好的效率算法来确定各个数各连续出现了几次?

ceoguang 发表于 2011-2-12 00:13:22

我明白你的意思了,但是,你这个依然是可以通过正则来计算的.你没看出规律?
假设你要寻找的数字为2,只是数值在UBound($arr) + 1 内都算是重复出现了对吧?不对,这里又生出多一个新问题.假如$arr的数值为,这里1算是重复吗?

3mile 发表于 2011-2-12 10:55:57

回复 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-12 14:07:56

本帖最后由 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

papapa314 发表于 2011-2-12 14:08:45

回复 4# ceoguang


谢谢C版,想到一个方法了,希望给提提意见。
页: [1]
查看完整版本: 效率算法 如何判断一组数中每个数连续出现几次