16.小朋友拍照 有來自K(1<=K<=20)個不同國家的N(1<=N<=100)個小朋友排成一行準備拍照.國籍用數(shù)字1,2,3…N表示,每個小朋友的國籍依次存入數(shù)組a(1)到a(K). 由于小朋友太多,沒有辦法全部被拍入.?dāng)z像師決定拍攝一段連續(xù)區(qū)間內(nèi)的小朋友,這個區(qū)間內(nèi)每種國籍的小朋友至少要有1人,求滿足要求的最小區(qū)間長度. 例如有10個小朋友,5種國籍,從左到右排列.國籍編號依次是2,1,2,4,3,3,5,5,3,5,則最小的一段包含所有5種國籍的區(qū)間是從第2個到第7個小朋友,區(qū)間長度為6. 算法解析:區(qū)間的長度至少為K(國籍的數(shù)量),最大為N(小朋友的數(shù)量).我們可以通過二分K到N之間的求得最小區(qū)間長度. 實現(xiàn)上述功能的VB代碼如下,但加框處代碼有錯,請改正. Dim a(1 To 100)As Integer'依次存儲為1到100的小朋友的國籍編號 Dim K As Integer Dim N As Integer Private Sub Form_Load( )'窗體加載,生成數(shù)據(jù) '產(chǎn)生N的值,表示人數(shù) '產(chǎn)生K的值,表示國籍種數(shù) '產(chǎn)生編號為1到N的小朋友的國籍編號,并存儲在數(shù)組a中 '代碼略 End Sub Private Sub Command1_Click( )'使用二分的思想計算最小區(qū)間 Dim M As Integer i=K:j=N'答案的范圍為K到N,即最少K,最多N個小朋友 Do While i<=j M=(i+j)\2'二分,求中間值 If pd(M)=True Then'調(diào)用Pd函數(shù),判斷區(qū)間長度為M時,是否包含所有國籍 j=M-1 ans=M'若以M為區(qū)間長度可包含所有國籍,更新答案 Else i='第①處錯誤 End If Loop Text1.Text=Str(ans) End Sub
Function pd(M As Integer) As Boolean Dim f(1 To 20)As Integer'f(i)表示國籍為i的小朋友是否包含 Dim t As Integer't用于統(tǒng)計當(dāng)前區(qū)間包含的國籍?dāng)?shù)量 pd=False For i=1 To N-M+1'枚舉以i為起點的M個小朋友中,各個國籍是否包含 For j=i To i+M-1 f(a(j))=1'等于1,表示國籍為a(j)的小朋友已包含,0表示不包含 Next j t=0 For j=1 To K'統(tǒng)計已包含的國籍的數(shù)量 t='第②處錯誤 Next j If t=K Then pd=True:Exit Function'若包含K個國籍,返回True For j=1 To K'f數(shù)組元素重新初始化為0 f(j)=0 Next j Next i End Function.
17.字符串刪除與插入 給定一個長度不超過100位的字符串S,現(xiàn)有以下兩種操作指令: 指令1(刪除):給出一個字符串S1,在字符串S中找到最左邊的一個字符串S1,將其刪除,若在S中不存在字符串S1,則字符串S不變. 例如:S=“China is a big family,it is big”S1=“big” 則執(zhí)行指令1后,S=“China is a family,it is big” 若S1=“small”,則S不變 指令2(插入):給出了一個字符串S2,和一個整數(shù)w,將S2插入到S中以w開始的位置. 例如:S=“a big family”S2=“very”w=3 則執(zhí)行指令2后,S=“a very big family” 注意S中“a”后有一個空格,S2中“y”后有一個空格 實現(xiàn)上述功能的VB程序如下.請在橫線處填入合適代碼. Dim S As String Private Sub Command1_Click( ?。?單擊Command1實現(xiàn)刪除指令 Dim S1 As String S=Text1.Text S1=Text1.Text S=del(S1) Text5.Text=S End Sub Private Sub Command2_Click( ?。?單擊Command2實現(xiàn)插入指令 Dim S2 As String,W As Integer S=Text1.Text S2=Text2.Text W=Val(Text4.Text) S=
'調(diào)用函數(shù),實現(xiàn)出入指令 Text5.Text=S End Sub Function del(S1 As String) As String'在字符串S中查找并刪除S1 Dim S3 As String For i=1 To Len(S)-Len(S1)+1 S3=““'S3表示從位置i開始,取出長度和S1相同的字符串 For i=i To i+Len(S1)-1 S3=S3+Mid(S,j,1) Next j If
Then'如果找到S1,則將S1刪除 S=Mid(S,1,i-1)+Mid(S,i+Len(S1),Len(S)-Len(S1)-i+2) del=S Exit Function'刪除左邊的第一個S1后,退出函數(shù),以保證只刪除一次 End If Next i End Function Function add(S2 As String,W As Integer) As String S=Mid(S,1,W-1)+S2+