Nhờ giúp đỡ vấn đề thuật toán (1 người xem)

Người dùng đang xem chủ đề này

Status
Không mở trả lời sau này.

khongtu19bk

Thành viên hoạt động
Tham gia
5/12/09
Bài viết
147
Được thích
69
Mình có bài toán thế này. Cell A1 có nội dung là A/B/D/C . Cần tạo hàm để nội dung cell A1 thành A/B/C/D. Tương tự nội dung cell A2 là B/C/F/E thì thông qua hàm này nội dung của nó trở thành B/C/E/F. Tức là hàm này se sắp xếp các ký tự theo thứ tự A,B,C...

Mình cần xây dựng hàm như vậy. Vấn đề là xây dựng làm sao để tốc độ xử lý là nhanh và tối ưu.

Ai biet xin mach giup minh.
 
Mình có bài toán thế này. Cell A1 có nội dung là A/B/D/C . Cần tạo hàm để nội dung cell A1 thành A/B/C/D. Tương tự nội dung cell A2 là B/C/F/E thì thông qua hàm này nội dung của nó trở thành B/C/E/F. Tức là hàm này se sắp xếp các ký tự theo thứ tự A,B,C...

Mình cần xây dựng hàm như vậy. Vấn đề là xây dựng làm sao để tốc độ xử lý là nhanh và tối ưu.

Ai biet xin mach giup minh.
Hỏi thêm bạn:
- Cú pháp trong cell chỉ gồm chữ cái viết hoa (A-Z) và dấu back Slash (\) hay còn ký tự nào khác.
- Dạng chuối có tương đồng của tất cả các Cell không
- Cú pháp chuỗi như thế nào A/B/...Z/ hay là A/B/...Z, hay trường hợp khác.
- Nếu có trùng nhau như A/A/A/B/C/B/ thì có loại bỏ không, hay vẫn giữ nguyên
 
Lần chỉnh sửa cuối:
Upvote 0
Thôi thì cứ giả định chỉ có các chứ cái in hoa từ A-Z, cú pháp A/B/C...Z (kết thúc bằng chữ cái)
bạn có thể sử dụng theo phương pháp sắp xếp nổi bọt sau:
[GPECODE=vb]
Function SortBub(MyRange As String, Slash As String)
Dim TmpArr, Trunggian As String
TmpArr = Split(MyRange, Slash)
For i = 1 To UBound(TmpArr) Step 1
For j = UBound(TmpArr) To i Step -1
If Asc(TmpArr(j)) < Asc(TmpArr(j - 1)) Then
Trunggian = TmpArr(j)
TmpArr(j) = TmpArr(j - 1)
TmpArr(j - 1) = Trunggian
End If
Next j
Next i
SortBub = Join(TmpArr, Slash)
End Function[/GPECODE]
 
Upvote 0
Nếu luôn luôn là một ký tự, và một gạch chéo thì dùng phương pháp chuỗi định sẵn tương đối có hiệu quả (1)
Đặt một chuõi 52 (2*26) ký tự toàn dấu cách.
Đọc chuỗi input, cú gặp ký tự nào thì tìm vị trí của nó trong chuỗi output (công thức tìm vị trí tương đối dễ), và dùng hàm MID để ghi vào , kèm với dấu chéo (/).
Replace dấu cách với "", và loại dấu chéo cuối cùng.

(1) tôi chỉ nói tương đối hiệu quả thôi. Còn "nhanh và tối ưu" không phải là điểm trọng yếu của tôi cho nên tôi không bao giờ màng tới.
(2) dùng phông toàn đỏ, cũng toàn tô đậm, toàn viết hoa là phương pháp bắt loa lên la làng để gây sự chú ý về mình. Trong diễn đàn, đó là một điều khá bất lịch sự,
 
Upvote 0
Mình xin trả lời là không có chuỗi kí tự trùng nhau. Kí tự gồm số và chữ cái và dấu /. Ví dụ như là 3010 1NM0E/3010 1NM0B/3010 1NM0C thì nội dung sẽ được chuyển thành 3010 1NM0B/3010 1NM0C/3010 1NM0E.
 
Upvote 0
Mình xin trả lời là không có chuỗi kí tự trùng nhau. Kí tự gồm số và chữ cái và dấu /. Ví dụ như là 3010 1NM0E/3010 1NM0B/3010 1NM0C thì nội dung sẽ được chuyển thành 3010 1NM0B/3010 1NM0C/3010 1NM0E.
Vậy thì nói luôn ngay từ đầu là gồm số và chuỗi, còn giả định A/B/C làm chi.
tốt nhất là bạn nên gửi file đính kèm lên liệt kê các trường hợp dữ liệu có và kết quả mong muốn đạt được.
 
Upvote 0
Mình xin trả lời là không có chuỗi kí tự trùng nhau. Kí tự gồm số và chữ cái và dấu /. Ví dụ như là 3010 1NM0E/3010 1NM0B/3010 1NM0C thì nội dung sẽ được chuyển thành 3010 1NM0B/3010 1NM0C/3010 1NM0E.
Cũng bon chen vô chút
Cú pháp =Sapxep(a1,"/")
PHP:
Function SapXep(cell As Range, Del As String) As String
Dim Tmp, I As Long, J As Long, Changed As Boolean, Temp
Tmp = Split(cell, Del)
For I = 0 To UBound(Tmp) - 1
    Changed = False
    For J = 0 To UBound(Tmp) - 1
        If Right(Tmp(J), 1) > Right(Tmp(J + 1), 1) Then
            Temp = Tmp(J)
            Tmp(J) = Tmp(J + 1)
            Tmp(J + 1) = Temp
        End If
        Changed = True
    Next
    If Changed = False Then Exit For
Next
SapXep = Join(Tmp, Del)
End Function
 
Upvote 0
Mình thấy bài này không phải tác giả yêu cầu sắp xếp lại trật tự của chuỗi mà chỉ là đảo hai cụm chuỗi cuối cùng mà thôi

Vậy bạn tham khảo Hàm đơn giản như sau xem sao:

Mã:
Function CorrectStr(ByVal Ch As String, Optional Sl As String = "/")
Dim Tm, NewCh As String, i
Tm = Split(Ch, Sl)
If UBound(Tm) < 1 Then
CorrectStr = Ch
Exit Function
End If
For i = LBound(Tm) To UBound(Tm)
If i < UBound(Tm) - 1 Then
NewCh = NewCh & IIf(NewCh = "", "", Sl) & Tm(i)
ElseIf i < UBound(Tm) Then
NewCh = NewCh & IIf(NewCh = "", "", Sl) & Tm(i + 1)
ElseIf i = UBound(Tm) Then
NewCh = NewCh & IIf(NewCh = "", "", Sl) & Tm(i - 1)
End If
Next
CorrectStr = NewCh
End Function
 
Upvote 0
Status
Không mở trả lời sau này.

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

Back
Top Bottom