Tìm k=3 giá trị Xuất hiện nhiều nhất trong một dãy số

Liên hệ QC

sacalataba127

Thành viên hoạt động
Tham gia
6/4/16
Bài viết
148
Được thích
12
Giới tính
Nam
Em có dãy số ........daySoBanDau="123456 23456 456 789"
Em muốn tìm k=3 số xuất hiện nhiều nhất của dãy số trên
Kết quả ví dụ: 456
Em có viết đoạn VBA nhỏ, mà đang bí cách làm bước tiếp theo ạ
Có cách nào hay chỉ em với ạ.


PHP:
Private Function FindMax(daySoBanDau, k)
   '1. Khai bao bien
   Dim valueMaxKetQua As String
   Dim i, tongXuatHien As Long
   '2. Tinh toan Max
   For i = 0 To 9
      'Tinh Tong Xuat hien cua so i( i tu 0 den 9)
      tongXuatHien = Len(daySoBanDau) - Len(WorksheetFunction.Substitute(daySoBanDau, i, ""))

      If tongXuatHien > 0 Then
         '...
         '...
         If Len(valueMaxKetQua) < k Then valueMaxKetQua = valueMaxKetQua & i
      End If

   Next i
   FindMax = valueMaxKetQua
End Function
 
Lần chỉnh sửa cuối:
Nếu gặp dãy 11111 thì có tính là 3 lần 111 không?

Bạn bí là phải rồi. Loại toán tổ hợp này đòi hỏi nhiều lắm, không chỉ biết viết code là đủ.
1. Nắm vững đề bài, đòi hỏi như thế nào?
2. Nắm vững các trường hợp dữ liệu, có những dữ liệu rắc rối như thế nào?
3. Kinh nghiệm về phân tích và hiểu biết về giới hạn.
4. Kiến thức về vòng lặp và đệ quy.
5. Kiến thức toán ứng dụng.

Nếu chỉ là để tập code thì quên đi. Kiếm bài khác hữu dụng hơn.
 
Nếu gặp dãy 11111 thì có tính là 3 lần 111 không?

Bạn bí là phải rồi. Loại toán tổ hợp này đòi hỏi nhiều lắm, không chỉ biết viết code là đủ.
1. Nắm vững đề bài, đòi hỏi như thế nào?
2. Nắm vững các trường hợp dữ liệu, có những dữ liệu rắc rối như thế nào?
3. Kinh nghiệm về phân tích và hiểu biết về giới hạn.
4. Kiến thức về vòng lặp và đệ quy.
5. Kiến thức toán ứng dụng.

Nếu chỉ là để tập code thì quên đi. Kiếm bài khác hữu dụng hơn.
dạ căng não anh ạ, đang khó nên hỏi thôi ạ, làm được mới thú vị ạ
Nếu gặp dãy trên 11111 thì tính là 5 lần số 1, tức là
tongXuatHien = 5 ạ
 
dạ căng não anh ạ, đang khó nên hỏi thôi ạ, làm được mới thú vị ạ
Nếu gặp dãy trên 11111 thì tính là 5 lần số 1, tức là
tongXuatHien = 5 ạ
Bạn trả lời kiểu đó thì còn cần học nhiều về 3 điểm đầu tôi nêu ra ở bài #2
Trở lại lời khuyên: tìm bài khác đi. Căng não thì tự giải, có bí thì cũng chỉ một bước nhỏ. Chứ như bạn là hỏi từ a đến z, có làm được chút nào đâu mà "thú".

Bài này khó ở cái giải thuật chứ code có gì đâu. Mà bạn thì hoàn toàn chả thấy cái giải thuật.
 
Bạn trả lời kiểu đó thì còn cần học nhiều về 3 điểm đầu tôi nêu ra ở bài #2
Trở lại lời khuyên: tìm bài khác đi. Căng não thì tự giải, có bí thì cũng chỉ một bước nhỏ. Chứ như bạn là hỏi từ a đến z, có làm được chút nào đâu mà "thú".

Bài này khó ở cái giải thuật chứ code có gì đâu. Mà bạn thì hoàn toàn chả thấy cái giải thuật.
Vâng cảm ơn a lời khuyên ạ :heart:
 
Dim Element(1 To 6) As Integer

Private Sub Demo()
Element(1) = 1
Element(2) = 1
Element(3) = 1
Element(4) = 1
Element(5) = 4
Element(6) = 2

MsgBox CountArray(Element, 1)
End Sub

Private Function CountArray(Ar() As Integer, ToFind As Integer) As Long
For i = LBound(Ar) To UBound(Ar)
If Ar(i) = ToFind Then
CountArray = CountArray + 1
End If
Next
End Function
 
Em có dãy số ........daySoBanDau="123456 23456 456 789"
Em muốn tìm k=3 số xuất hiện nhiều nhất của dãy số trên
Kết quả ví dụ: 456
Em có viết đoạn VBA nhỏ, mà đang bí cách làm bước tiếp theo ạ
Có cách nào hay chỉ em với ạ.


PHP:
Private Function FindMax(daySoBanDau, k)
   '1. Khai bao bien
   Dim valueMaxKetQua As String
   Dim i, tongXuatHien As Long
   '2. Tinh toan Max
   For i = 0 To 9
      'Tinh Tong Xuat hien cua so i( i tu 0 den 9)
      tongXuatHien = Len(daySoBanDau) - Len(WorksheetFunction.Substitute(daySoBanDau, i, ""))

      If tongXuatHien > 0 Then
         '...
         '...
         If Len(valueMaxKetQua) < k Then valueMaxKetQua = valueMaxKetQua & i
      End If

   Next i
   FindMax = valueMaxKetQua
End Function
Bạn tham khảo.
Mã:
Function ketqua(ByVal dayso As String, ByVal so As Integer)
        Dim i As Long, dic As Object, dk As String, day As String, max As Integer, S As String, arr
        Set dic = CreateObject("scripting.dictionary")
        day = Replace(dayso, " ", "")
        If so > Len(day) Then max = "khong co": Exit Function
        For i = 1 To Len(day) - so
            dk = Mid(day, i, so)
            If Not dic.exists(dk) Then
               dic.Add dk, 1
            Else
               dic.Item(dk) = dic.Item(dk) + 1
            End If
            If max < dic.Item(dk) Then max = dic.Item(dk)
        Next i
        arr = dic.keys
        For i = 0 To UBound(arr)
            If dic.Item(arr(i)) = max Then
               S = S & ";" & arr(i)
            End If
        Next i
        ketqua = Right(S, Len(S) - 1)
End Function
 
Bạn tham khảo.
Mã:
Function ketqua(ByVal dayso As String, ByVal so As Integer)
        Dim i As Long, dic As Object, dk As String, day As String, max As Integer, S As String, arr
        Set dic = CreateObject("scripting.dictionary")
        day = Replace(dayso, " ", "")
        If so > Len(day) Then max = "khong co": Exit Function
        For i = 1 To Len(day) - so
            dk = Mid(day, i, so)
            If Not dic.exists(dk) Then
               dic.Add dk, 1
            Else
               dic.Item(dk) = dic.Item(dk) + 1
            End If
            If max < dic.Item(dk) Then max = dic.Item(dk)
        Next i
        arr = dic.keys
        For i = 0 To UBound(arr)
            If dic.Item(arr(i)) = max Then
               S = S & ";" & arr(i)
            End If
        Next i
        ketqua = Right(S, Len(S) - 1)
End Function
Code gọn thế anh, để e Test ạ
Bài đã được tự động gộp:

PHP:
Option Explicit

Private Function FindMax(valueCanFindMax, k)
    '1. Khai bao bien
    Dim tkSoArray, tkSoTemp
    Dim valueMaxKetQua As String
    Dim i, j, tKeSoAll, tKeSo0, tKeSo1, tKeSo2, tKeSo3, tKeSo4, tKeSo5, tKeSo6, tKeSo7, tKeSo8, tKeSo9 As Long
    '2. Tinh toan Max
    '.. Tinh Tong Xuat hien cua so i( i tu 0 den 9)
    tKeSo0 = Len(valueCanFindMax) - Len(WorksheetFunction.Substitute(valueCanFindMax, 0, ""))
    tKeSo1 = Len(valueCanFindMax) - Len(WorksheetFunction.Substitute(valueCanFindMax, 1, ""))
    tKeSo2 = Len(valueCanFindMax) - Len(WorksheetFunction.Substitute(valueCanFindMax, 2, ""))
    tKeSo3 = Len(valueCanFindMax) - Len(WorksheetFunction.Substitute(valueCanFindMax, 3, ""))
    tKeSo4 = Len(valueCanFindMax) - Len(WorksheetFunction.Substitute(valueCanFindMax, 4, ""))
    tKeSo5 = Len(valueCanFindMax) - Len(WorksheetFunction.Substitute(valueCanFindMax, 5, ""))
    tKeSo6 = Len(valueCanFindMax) - Len(WorksheetFunction.Substitute(valueCanFindMax, 6, ""))
    tKeSo7 = Len(valueCanFindMax) - Len(WorksheetFunction.Substitute(valueCanFindMax, 7, ""))
    tKeSo8 = Len(valueCanFindMax) - Len(WorksheetFunction.Substitute(valueCanFindMax, 8, ""))
    tKeSo9 = Len(valueCanFindMax) - Len(WorksheetFunction.Substitute(valueCanFindMax, 9, ""))
    '.. Sap xep cac so tu Nho den Lon
    tkSoArray = Array(tKeSo0, tKeSo1, tKeSo2, tKeSo3, tKeSo4, tKeSo5, tKeSo6, tKeSo7, tKeSo8, tKeSo9)
    For i = 0 To UBound(tkSoArray)
        For j = UBound(tkSoArray) To i + 1 Step -1
           If tkSoArray(j) < tkSoArray(i) Then
              tkSoTemp = tkSoArray(j)
              tkSoArray(j) = tkSoArray(i)
              tkSoArray(i) = tkSoTemp
           End If
        Next j
     Next i
    '.. Lay ra k vi tri can
    For i = 9 To 0 Step -1
        'Xet neu so chua Add vao Ket qua
        If tKeSo0 = tkSoArray(i) Then tKeSoAll = 0: If InStr(1, valueMaxKetQua, tKeSoAll) = 0 Then GoTo ThemSoNay
        If tKeSo1 = tkSoArray(i) Then tKeSoAll = 1: If InStr(1, valueMaxKetQua, tKeSoAll) = 0 Then GoTo ThemSoNay
        If tKeSo2 = tkSoArray(i) Then tKeSoAll = 2: If InStr(1, valueMaxKetQua, tKeSoAll) = 0 Then GoTo ThemSoNay
        If tKeSo3 = tkSoArray(i) Then tKeSoAll = 3: If InStr(1, valueMaxKetQua, tKeSoAll) = 0 Then GoTo ThemSoNay
        If tKeSo4 = tkSoArray(i) Then tKeSoAll = 4: If InStr(1, valueMaxKetQua, tKeSoAll) = 0 Then GoTo ThemSoNay
        If tKeSo5 = tkSoArray(i) Then tKeSoAll = 5: If InStr(1, valueMaxKetQua, tKeSoAll) = 0 Then GoTo ThemSoNay
        If tKeSo6 = tkSoArray(i) Then tKeSoAll = 6: If InStr(1, valueMaxKetQua, tKeSoAll) = 0 Then GoTo ThemSoNay
        If tKeSo7 = tkSoArray(i) Then tKeSoAll = 7: If InStr(1, valueMaxKetQua, tKeSoAll) = 0 Then GoTo ThemSoNay
        If tKeSo8 = tkSoArray(i) Then tKeSoAll = 8: If InStr(1, valueMaxKetQua, tKeSoAll) = 0 Then GoTo ThemSoNay
        If tKeSo9 = tkSoArray(i) Then tKeSoAll = 9: If InStr(1, valueMaxKetQua, tKeSoAll) = 0 Then GoTo ThemSoNay
ThemSoNay:
        '..Them vao Ket qua neu so do < so luong so ky tu muon lay + 1
        If Len(valueMaxKetQua) < k Then
            valueMaxKetQua = valueMaxKetQua & tKeSoAll
        End If
        tKeSoAll = Empty
    Next i
    '3. Paste Ket qua Tim duoc
    FindMax = valueMaxKetQua
End Function
Em làm được rồi mà nó hơi gà Xíu
Bài đã được tự động gộp:

Bạn tham khảo.
Mã:
Function ketqua(ByVal dayso As String, ByVal so As Integer)
        Dim i As Long, dic As Object, dk As String, day As String, max As Integer, S As String, arr
        Set dic = CreateObject("scripting.dictionary")
        day = Replace(dayso, " ", "")
        If so > Len(day) Then max = "khong co": Exit Function
        For i = 1 To Len(day) - so
            dk = Mid(day, i, so)
            If Not dic.exists(dk) Then
               dic.Add dk, 1
            Else
               dic.Item(dk) = dic.Item(dk) + 1
            End If
            If max < dic.Item(dk) Then max = dic.Item(dk)
        Next i
        arr = dic.keys
        For i = 0 To UBound(arr)
            If dic.Item(arr(i)) = max Then
               S = S & ";" & arr(i)
            End If
        Next i
        ketqua = Right(S, Len(S) - 1)
End Function
ByVal so As Integer này là số Ký tự Lớn nhất ạ
 

File đính kèm

  • ketqua.png
    ketqua.png
    16.6 KB · Đọc: 11
Lần chỉnh sửa cuối:
Code gọn thế anh, để e Test ạ
Bài đã được tự động gộp:

PHP:
Option Explicit

Private Function FindMax(valueCanFindMax, k)
    '1. Khai bao bien
    Dim tkSoArray, tkSoTemp
    Dim valueMaxKetQua As String
    Dim i, j, tKeSoAll, tKeSo0, tKeSo1, tKeSo2, tKeSo3, tKeSo4, tKeSo5, tKeSo6, tKeSo7, tKeSo8, tKeSo9 As Long
    '2. Tinh toan Max
    '.. Tinh Tong Xuat hien cua so i( i tu 0 den 9)
    tKeSo0 = Len(valueCanFindMax) - Len(WorksheetFunction.Substitute(valueCanFindMax, 0, ""))
    tKeSo1 = Len(valueCanFindMax) - Len(WorksheetFunction.Substitute(valueCanFindMax, 1, ""))
    tKeSo2 = Len(valueCanFindMax) - Len(WorksheetFunction.Substitute(valueCanFindMax, 2, ""))
    tKeSo3 = Len(valueCanFindMax) - Len(WorksheetFunction.Substitute(valueCanFindMax, 3, ""))
    tKeSo4 = Len(valueCanFindMax) - Len(WorksheetFunction.Substitute(valueCanFindMax, 4, ""))
    tKeSo5 = Len(valueCanFindMax) - Len(WorksheetFunction.Substitute(valueCanFindMax, 5, ""))
    tKeSo6 = Len(valueCanFindMax) - Len(WorksheetFunction.Substitute(valueCanFindMax, 6, ""))
    tKeSo7 = Len(valueCanFindMax) - Len(WorksheetFunction.Substitute(valueCanFindMax, 7, ""))
    tKeSo8 = Len(valueCanFindMax) - Len(WorksheetFunction.Substitute(valueCanFindMax, 8, ""))
    tKeSo9 = Len(valueCanFindMax) - Len(WorksheetFunction.Substitute(valueCanFindMax, 9, ""))
    '.. Sap xep cac so tu Nho den Lon
    tkSoArray = Array(tKeSo0, tKeSo1, tKeSo2, tKeSo3, tKeSo4, tKeSo5, tKeSo6, tKeSo7, tKeSo8, tKeSo9)
    For i = 0 To UBound(tkSoArray)
        For j = UBound(tkSoArray) To i + 1 Step -1
           If tkSoArray(j) < tkSoArray(i) Then
              tkSoTemp = tkSoArray(j)
              tkSoArray(j) = tkSoArray(i)
              tkSoArray(i) = tkSoTemp
           End If
        Next j
     Next i
    '.. Lay ra k vi tri can
    For i = 9 To 0 Step -1
        'Xet neu so chua Add vao Ket qua
        If tKeSo0 = tkSoArray(i) Then tKeSoAll = 0: If InStr(1, valueMaxKetQua, tKeSoAll) = 0 Then GoTo ThemSoNay
        If tKeSo1 = tkSoArray(i) Then tKeSoAll = 1: If InStr(1, valueMaxKetQua, tKeSoAll) = 0 Then GoTo ThemSoNay
        If tKeSo2 = tkSoArray(i) Then tKeSoAll = 2: If InStr(1, valueMaxKetQua, tKeSoAll) = 0 Then GoTo ThemSoNay
        If tKeSo3 = tkSoArray(i) Then tKeSoAll = 3: If InStr(1, valueMaxKetQua, tKeSoAll) = 0 Then GoTo ThemSoNay
        If tKeSo4 = tkSoArray(i) Then tKeSoAll = 4: If InStr(1, valueMaxKetQua, tKeSoAll) = 0 Then GoTo ThemSoNay
        If tKeSo5 = tkSoArray(i) Then tKeSoAll = 5: If InStr(1, valueMaxKetQua, tKeSoAll) = 0 Then GoTo ThemSoNay
        If tKeSo6 = tkSoArray(i) Then tKeSoAll = 6: If InStr(1, valueMaxKetQua, tKeSoAll) = 0 Then GoTo ThemSoNay
        If tKeSo7 = tkSoArray(i) Then tKeSoAll = 7: If InStr(1, valueMaxKetQua, tKeSoAll) = 0 Then GoTo ThemSoNay
        If tKeSo8 = tkSoArray(i) Then tKeSoAll = 8: If InStr(1, valueMaxKetQua, tKeSoAll) = 0 Then GoTo ThemSoNay
        If tKeSo9 = tkSoArray(i) Then tKeSoAll = 9: If InStr(1, valueMaxKetQua, tKeSoAll) = 0 Then GoTo ThemSoNay
ThemSoNay:
        '..Them vao Ket qua neu so do < so luong so ky tu muon lay + 1
        If Len(valueMaxKetQua) < k Then
            valueMaxKetQua = valueMaxKetQua & tKeSoAll
        End If
        tKeSoAll = Empty
    Next i
    '3. Paste Ket qua Tim duoc
    FindMax = valueMaxKetQua
End Function
Em làm được rồi mà nó hơi gà Xíu
Bài đã được tự động gộp:


ByVal so As Integer này là số Ký tự Lớn nhất ạ
Code a/c Snow25 ngắn gọn quá, fix để ra Kết quả đi e tham khảo với ạ
 
Kỹ thuật đếm ký tự như thế này:

' đếm lần xuất hiện của các chữ số trong một chuỗi chuoi
' lưu ý là code sẽ thay đổi chuoi. Vì vậy, nếu là tham số của hàm hay sub thì nên khai ByVal
' chuoi sẽ từ từ rút ngắn để tăng hiệu quả hàm.
' code hơi dài là vì nó tiết kiệm số lần gọi các hàm.
Dim chuSo(0 To 9) As Integer ' mảng chứa số đếm
Dim i As Integer, d1 As Integer, d2 As Integer
d1 = Len(chuoi) ' độ dài chuỗi trước xử lý
For i = 0 To 9
If d1 = 0 Then Exit For
chuoi = Replace(chuoi, CStr(i), "")
d2 = Len(chuoi) ' độ dài sau xử lý
chuSo(i) = d1 - d2
d1 = d2
Next i

Lưu ý là bài toán yêu cầu của thớt tự nó đã không đủ lô gic.
"tìm k=3 số xuất hiện nhiều nhất"
Lỡ có nhiều hơn 3 số bằng nhau thì sao? Làm việc với từ "nhất" thì phải biết rằng con số đứng nhất không hẳn phải là 1.
 
Lần chỉnh sửa cuối:
Kỹ thuật đếm ký tự như thế này:

' đếm lần xuất hiện của các chữ số trong một chuỗi chuoi
' lưu ý là code sẽ thay đổi chuoi. Vì vậy, nếu là tham số của hàm hay sub thì nên khai ByVal
' chuoi sẽ từ từ rút ngắn để tăng hiệu quả hàm.
' code hơi dài là vì nó tiết kiệm số lần gọi các hàm.
Dim chuSo(0 To 9) As Integer ' mảng chứa số đếm
Dim i As Integer, d1 As Integer, d2 As Integer
d1 = Len(chuoi) ' độ dài chuỗi trước xử lý
For i = 0 To 9
If d1 = 0 Then Exit For
chuoi = Replace(chuoi, CStr(i), "")
d2 = Len(chuoi) ' độ dài sau xử lý
chuSo(i) = d1 - d2
d1 = d2
Next i

Lưu ý là bài toán yêu cầu của thớt tự nó đã không đủ lô gic.
"tìm k=3 số xuất hiện nhiều nhất"
Lỡ có nhiều hơn 3 số bằng nhau thì sao? Làm việc với từ "nhất" thì phải biết rằng con số đứng nhất không hẳn phải là 1.
Dạ cảm ơn anh chỉ bảo ạ
 
Để sort cái mảng chuSo trên thì làm thế này:

For i = 0 to 9
chuSo(i) = chuSo(i) *10 + i
Next i
' code bubble sort ở đây
' sau khi sort xong thì lấy ra n trị "xuất hiện nhiều nhất [sic]"
For i = 9 To 9-n+1 Step -1
nhieuNhat = nhieuNhat & (chuSo(i) Mod 10)
soLuot = soLuot & " " & (chuSo(i) \ 10)
Next i
 
Web KT

Bài viết mới nhất

Back
Top Bottom