Bạn sử dụng đảo ngược chuỗi để làm gì? [đóng cửa]


15

Trong PHP strrev(), trong Rails .reverse, nhưng hầu hết các ngôn ngữ không có chức năng đảo ngược chuỗi. Một số có chức năng đảo ngược mảng có thể được sử dụng trên các ký tự. Tôi đã nghĩ rằng đây phải là một sự giám sát lớn nhưng sau đó nó đã xảy ra với tôi, bạn thực sự sẽ sử dụng chuỗi ngược để làm gì ???

Lần duy nhất tôi có thể nghĩ rằng tôi đã thấy nó là trong các bản demo và bài học để biến "Hello World!" thành "! dlroW olleH".

Câu hỏi của tôi là; Có sử dụng để đảo ngược một chuỗi hoặc nó hoàn toàn vô nghĩa?

.

Phụ lục

Đã có nhiều câu trả lời mà tôi đã dự đoán và không phải tất cả chúng đều hoàn toàn mang tính học thuật. Tôi đã đặt tiền mà không ai có thể đưa ra một ví dụ hợp pháp. Tôi cũng không nghĩ mình sẽ học được điều gì mới nhưng gợi ý regex của Mark Canlas thật tuyệt vời và tôi mong chờ cơ hội để nó chứng tỏ điều đó. Cảm ơn tất cả.


@clockworkgeek - nếu bạn yêu cầu một ứng cử viên thực hiện đảo ngược chuỗi trong ngôn ngữ yêu thích của họ, bạn sẽ ngạc nhiên khi có nhiều người không nghĩ ra chức năng cơ bản mà bạn đã đề cập. Sau đó, có bao nhiêu người không thể nghĩ ra một vòng lặp để tự thực hiện nó.
justkt

@justkt - Đó là một câu hỏi hoàn toàn khác đang chờ để xảy ra nhưng có thể là một chủ đề cho TopCoder thay thế.
clockworkgeek

6
Để gửi tin nhắn văn bản có thể đọc được trong gương chiếu hậu trong khi lái xe, vì vậy cảnh sát sẽ không chú ý.
JeffO

@justkt - Nếu tôi phải viết một vòng lặp để làm điều đó, tôi sẽ bắt đầu ở hai đầu đối diện hoán đổi ký tự cho đến khi đạt đến giữa. Nhưng sau đó, làm thế nào để bạn trao đổi hai giá trị? Đây chỉ đơn giản là câu trả lời hay nhất tôi từng được đưa ra:a ^= b; b ^= a; a ^= b;
clockworkgeek

1
tôi sử dụng đảo ngược chuỗi để đảo ngược chuỗi;)
Muad'Dib

Câu trả lời:


19

Người bán dâm

Đôi khi, các vấn đề liên quan đến các biểu thức chính quy có thể được viết dễ dàng hơn bằng cách đảo ngược chuỗi đầu vào và giải quyết vấn đề theo một cách khác.

Kỹ thuật lịch sự của người đàn ông đã dạy tôi Perl.

Sexeger trên PerlMonks


Cảm ơn bạn. Một mẹo rất tiện dụng để tìm ra cái cuối cùng của một cái gì đó. Ghi nhận hợp lệ.
clockworkgeek

Tôi đã làm điều này trong nhiều năm. Giúp phân tích địa chỉ email.
sal

23

Vâng, đây là một câu trả lời miệng lưỡi.

"Ngày trước" Tôi sở hữu một hộp Unix và nó có một tệp từ điển được sắp xếp các từ tiếng Anh, được sử dụng để kiểm tra chính tả.

Tôi đã tạo một tệp mới bằng cách đảo ngược tất cả các từ trong từ điển, sắp xếp nó và sau đó đảo ngược chúng một lần nữa. Kết quả là một danh sách các từ được sắp xếp từ phải sang trái.

Vì vậy, nếu bạn tìm kiếm một từ, bên cạnh từ đó sẽ là những từ có kết thúc tương tự. Vì vậy, thật dễ dàng để làm những bài thơ nhỏ!

Bạn thực sự có thể thích thú khi bạn thấy những gì vần với những gì.


13

Tôi đã là một lập trình viên / nhà phát triển / sysadmin trong khoảng 10 năm và tôi không thể nhớ mình cần phải đảo ngược chuỗi trong các tình huống thực tế.

Trường hợp sử dụng ngay lập tức mà tôi có thể nghĩ đến là chuyển đổi cơ sở số: được thực hiện một cách ngây thơ, thủ tục trả về một chuỗi đảo ngược. Tuy nhiên, với một chút toán học, bạn có thể tính toán trước dung lượng cần thiết, do đó bạn có thể bắt đầu điền vào bộ đệm từ cuối.


1
Có thể bit toán học đắt hơn so với đảo ngược chuỗi, vì vậy sau khi điểm chuẩn trên nền tảng của bạn (ARM, MIPS, x86), bạn có thể sử dụng đảo ngược chuỗi. Có lẽ.
Zan Lynx

Bạn có thể điền vào bộ đệm từ cuối và sử dụng a memmoveđến đầu khi kết thúc. Có lẽ rẻ hơn so với tính toán log (n) / log (cơ sở) để tính số chữ số cần thiết.
Patrick Schlüter

12
public bool IsPalindrome(string toCheck)
{
    return toCheck == toCheck.Reverse();
}

1
Đúng - chúng tôi thực sự có một cuộc phỏng vấn sàng lọc trong đó các ứng cử viên viết một trình kiểm tra palindrom và hầu hết làm điều này. Tuy nhiên, tôi thích nó hơn khi các ứng cử viên lặp đi lặp lại từ đó 0đến n/2và so sánh nhân vật ở đầu đối diện.
Nicole

@Renesis: Bạn cũng có thể làm: đặt p bắt đầu chuỗi, q cuối chuỗi, while ( (*p == *q) && (p <= q) {p++; q--} return p > q;bằng C và các ngôn ngữ con trỏ khác.
Michael K

4
Tôi cho rằng trong khi "trình kiểm tra palindrom" không hữu ích lắm, thì "hãy viết một trình kiểm tra palindrom" ít nhất có một mục đích.
clockworkgeek

2
Trong một cuộc phỏng vấn, họ yêu cầu tôi đảo ngược một chuỗi và họ nói "hãy nhớ chuỗi này không có chuỗi.Rverse (). Vì vậy, tôi chỉ chuyển đổi chuỗi thành một mảng ký tự và thực hiện Array.Reverse
Jack Marchetti

Đó là một cách sử dụng khá thích hợp và không phải là một ứng dụng mà bạn thường nói sẽ có giá trị kể cả trong ngôn ngữ / thư viện!
Dan Diplo

8

Phỏng vấn!

Đảo ngược một chuỗi (tại chỗ hay không) là một câu hỏi phỏng vấn rất phổ biến cho kiến ​​thức lập trình cơ bản. Một ngôn ngữ thiếu các chức năng được xây dựng này sẽ khó phỏng vấn. Ứng cử viên thực sự sẽ phải biết một cái gì đó. 1


1: Đây là một câu trả lời miệng lưỡi.


6

Tôi đã thấy các tình huống trong đó một ứng dụng máy tính để bàn đang nói chuyện với các thiết bị nhúng và liên tục chuyển đổi độ bền theo thứ tự byte và dữ liệu được di chuyển xung quanh dưới dạng chuỗi. Đó là về nó cho tôi mặc dù.

Tôi sẽ không sử dụng chuỗi cho ứng dụng đó nhưng đó chỉ là cách nó .....


+1 cho câu trả lời này. Nó ít nhất là một ví dụ thực tế mặc dù tôi cũng đã làm nó theo cách khác, có lẽ bằng cách chọn các kiểu nguyên thủy khác nhau về enddian.
clockworkgeek

5
<span style="unicode-bidi: bidi-override; direction:rtl;">
    <?php echo strrev($emailaddress); ?>
</span>

Không phải là giải pháp tốt nhất để làm xáo trộn địa chỉ email, vì khi bạn thêm nó vào bảng tạm, nó vẫn bị đảo ngược. Và, nếu nó trở nên phổ biến, nó sẽ sớm được phát hiện bằng cách quét các bot.

Tuy nhiên, nó đã được đề xuất .


1
Và obfuscation phổ biến nhất được sử dụng chỉ được đưa ra một câu trong toàn bộ bài viết đó ... Mã hóa dưới dạng hình ảnh.
clockworkgeek

1
@clockworkgeek, nó có thể là một giải pháp phổ biến nhưng IMHO là giải pháp hiệu quả nhất - không dễ tạo, không được nhúng trong HTML (tốc độ, lưu trữ hình ảnh, tải máy chủ), không phù hợp, không thể tạo kiểu với CSS và cùng trải nghiệm người dùng kém như đảo ngược chuỗi, về việc phải nhớ nó và gõ lại nó. Và có lẽ nhiều vấn đề hơn tôi không nghĩ đến.
Nicole

Mặc dù tò mò, sử dụng AT và DOT, cách dễ nhất để giải mã cho máy gặt đập, hóa ra lại có hiệu quả gần như hoàn hảo trong việc ngăn chặn thu hoạch. Đôi khi giữ nó đơn giản không phải là một ý tưởng tồi.
Joeri Sebrechts

5

ASCII không phải là mã hóa tốt nhất cho thông tin di truyền (bạn có thể đóng gói các loại cơ sở ACGT là 2 bit). Gói chúng thành một chuỗi dài và bạn nhận được 32 "chữ cái" di truyền cho mỗi từ. DNA có thể bị đảo ngược, vì vậy bạn phải kiểm tra một đoạn DNA chống lại cả hai phía trước là các bản sao ngược của chuỗi thử nghiệm. Vì vậy, việc có thể đảo ngược một chuỗi số lượng 2 bit đóng gói có thể rất hữu ích cho các loại phân tích di truyền khác nhau.

Tôi đã có một mục trên một điểm chuẩn cho các cơ quan gián điệp, bạn có thể đảo ngược các bit nó một cách nhanh như thế nào (thực sự là một mảng rất dài của các khoản dài). Phương pháp trao đổi 2 bit rõ ràng tại một thời điểm chậm hơn nhiều so với các phương pháp ít rõ ràng hơn. Chúng có liên quan đến một số thuật toán gọn gàng cho việc hoán vị mảng tại chỗ.

Tangurena: Hoạt động bạn đề cập đến được gọi là số lượng dân số. Các giá trị tương tự cho dữ liệu được đóng gói bit đang dẫn đầu và không đếm được. Có rất nhiều thứ thực sự gọn gàng mà người ta có thể làm với dữ liệu được đóng gói bit. Một thao tác duy nhất trên một thời gian dài là dữ liệu 64 chiều song song, vì vậy nếu bạn biết những gì bạn đang làm, bạn có thể có được hiệu suất đáng kinh ngạc cho một số loại tính toán nhất định.


Chủ đề thú vị, làm thế nào bạn sẽ đảo ngược một lĩnh vực bit?
clockworkgeek

"làm thế nào bạn sẽ đảo ngược một trường bit?"
Omega Centauri

2
Một cách tiếp cận là tra cứu bảng. Bạn có thể đảo ngược một byte bằng cách sử dụng bảng. Vì vậy, bạn có thể làm điều đó trên các byte không thường xuyên. Cũng có nhiều cách để di chuyển một số bit và một lần ... Một chút thông minh và đánh đổi (kích thước bảng so với số lượng hoạt động, v.v.) và bạn có thể cố gắng điều chỉnh nó.
Omega Centauri

5

Bất cứ điều gì khi làm việc với chuỗi đảo ngược là dễ dàng hơn.

Làm việc với các số nguyên dưới dạng chuỗi dễ dàng hơn rất nhiều nếu các chuỗi bị đảo ngược. Tôi đã xây dựng một số hàm thư viện để làm toán với các số nguyên lớn và sử dụng đảo ngược chuỗi để làm cho các hàm số học đơn giản hơn.

Cấp, tôi chỉ sử dụng nó để tạo ra các câu trả lời trên Project Euler, nhưng vẫn là tiền đề ban đầu.


+1. khi sử dụng biểu diễn chuỗi số, biểu diễn đảo ngược là rất hữu ích. và thông thường thư viện tiêu chuẩn sẽ đại diện cho các số theo thứ tự bình thường.
back2dos

3

Có thể hỗ trợ đa ngôn ngữ chi phí thấp, cho các ngôn ngữ sử dụng các chữ cái từ phải sang trái (như tiếng Ả Rập), thay vì từ trái sang phải. Tất nhiên bạn phải coi chừng các nhân vật có dấu thay đổi nhân vật phù hợp ...


2

Tôi không biết có lẽ ai đó có nhu cầu cháy bỏng để kiểm tra palindrom's ....

Tôi không nghĩ nó hoàn toàn vô dụng, vì có thể có những tình huống mà người ta cần để có thể đảo ngược một chuỗi.


Câu hỏi tiếp theo sẽ là, khi nào bạn cần kiểm tra một bảng màu trong thế giới thực? Một lần nữa, tôi chỉ thấy bất cứ ai quan tâm đến các bài học thuật toán.
clockworkgeek

ví dụ như cái này chẳng hạn: jimsabo.com/palindrome.html
Darknight

Tôi nghĩ có lẽ có những cách sử dụng khác, nhưng đó là tên miền cụ thể. Chẳng hạn, nếu các tìm kiếm chuỗi được tối ưu hóa cho tìm kiếm chuyển tiếp và bạn muốn thực hiện nhiều tìm kiếm cho lần xuất hiện cuối cùng, bạn có thể muốn đảo ngược nó trước. Đây sẽ là một tối ưu hóa, và không nên được thực hiện trừ khi có một trường hợp có thể chứng minh được cho nó. Tôi có thể hình dung một thuật toán để tạo ra hàm băm của giá trị chuỗi muốn sử dụng đầu đuôi, có thể đảo ngược, nếu nó xảy ra để cung cấp các đặc tính băm tốt hơn.
Scott Whitlock

2

Trong xử lý và phân tích ngôn ngữ tự nhiên, đôi khi việc tìm kiếm một chuỗi từ đầu đến đầu dễ dàng hơn. Một chuỗi đảo ngược sẽ hữu ích cho việc gỡ lỗi, hoặc như một cách khác để viết vòng lặp (đảo ngược chuỗi và sau đó lặp từ chỉ số 0 đến n-1).

Ngoài ra, một số ngôn ngữ được viết từ phải sang trái, do đó, bộ đảo ngược chuỗi có thể được sử dụng cho ngôn ngữ đó nếu bạn ở trong môi trường không nhận ra ngôn ngữ LTR / RTL.

Một chuỗi (trong một số ngôn ngữ) là một mảng ký tự, nhưng nó cũng có thể là tiền lương hoặc sửa đổi hàng tồn kho. Trong một vòng lặp di chuyển qua các vòng này, bạn có thể thực hiện một số phép tính giống nhau bất kể bạn xử lý chúng theo thứ tự nào. Một bài kiểm tra đơn vị hoàn hảo sẽ là kiểm tra xem liệu các phép tính áp dụng tương tự tiến hay lùi. Điều này có thể là rõ ràng để bổ sung, có thể không cho các hoạt động mờ hơn khác.


1

Đối với trình biên dịch?

Điều đó thật thú vị, nhưng hầu hết các biểu tượng trong một ngôn ngữ sẽ bắt đầu bằng một mẫu chung. Tôi không nói về Ký hiệu Hungary ở đây, nhưng nếu bạn nghĩ về không gian tên / lớp, thì rất nhiều biểu tượng sẽ thực sự chia sẻ một tiền tố chung .

myproject::SomeClass::GetFoo
myproject::SomeClass::GetBar

Vấn đề là, khi thực hiện tìm kiếm nhị phân, các tiền tố phổ biến là điều tồi tệ nhất bạn có thể gặp phải, bởi vì cuối cùng bạn sẽ so sánh các tiền tố đó nhiều lần.

Mặt khác, nếu bạn nhìn vào chuỗi ngược, bạn sẽ thấy entropy hơn nhiều! Và rồi đột nhiên một tìm kiếm nhị phân (trên Trie) trở nên mạnh mẽ hơn nhiều!

Nó luôn luôn cho tôi biết rằng các tên được đọc sai của C ++ (bởi gcc) không bị đảo ngược để đặt không gian tên LAST :)


0

Thỉnh thoảng tôi lật số điện thoại và chuỗi nhất định để tìm kiếm


0

Lần duy nhất tôi có thể nhớ lại khi thấy đảo ngược chuỗi đang được sử dụng là một hàm tôi đã thấy cách sử dụng nó trong khi phân tích tên tệp, để đảm bảo rằng '.' Nó tìm thấy trong tên tệp trên thực tế là dấu chấm cuối cùng tách biệt tên tệp từ phần mở rộng. tức là phân tích tên tệp như data.2010.12.08.dat, bạn sẽ đảo ngược chuỗi, tìm dấu chấm đầu tiên, trừ vị trí đó khỏi cuối chuỗi gốc và lấy chuỗi con. Tôi không nói rằng đó là cách tối ưu để làm điều đó, nhưng đó là những gì nó đã làm. Nó có thể là trong powerbuilder, nơi sử dụng các chức năng mạnh mẽ như vậy là phổ biến để giải quyết các vấn đề không rõ ràng khác nhau.


0

Ứng dụng worls thực sự duy nhất tôi thấy bằng cách sử dụng strrev là lưu trữ mật khẩu người dùng 'không thể đọc được' trong cơ sở dữ liệu ...

Nhưng tôi có thể nhớ có một mẫu trong C để sử dụng strrev, có thể tôi sẽ đưa ra nó sau.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.