คุณใช้การย้อนกลับสตริงเพื่ออะไร [ปิด]


15

ใน PHP เป็นของstrrev()Rails .reverseแต่ภาษาส่วนใหญ่ไม่มีฟังก์ชั่นการย้อนกลับสตริง บางคนมีฟังก์ชั่นย้อนกลับอาร์เรย์ที่สามารถใช้กับตัวละคร ฉันคิดว่ามันต้องเป็นการกำกับดูแลที่สำคัญ แต่แล้วมันก็เกิดขึ้นกับฉันคุณจะใช้สายอักขระย้อนกลับเพื่ออะไร

ครั้งเดียวที่ฉันคิดได้ว่าฉันได้เห็นมันเป็นการสาธิตและบทเรียนเพื่อเปลี่ยน "Hello World!" เป็น "! dlroW olleH"

คำถามของฉันคือ; มีการใช้สำหรับการย้อนกลับสตริงหรือมันไม่มีจุดหมายอย่างสมบูรณ์?

.

ภาคผนวก

มีคำตอบเพิ่มเติมที่ฉันคาดไว้และไม่ใช่ทั้งหมดที่เป็นวิชาการ ฉันจะใส่เงินที่ไม่มีใครสามารถมาด้วยตัวอย่างที่ถูกกฎหมาย ฉันก็ไม่คิดว่าฉันจะได้เรียนรู้อะไรใหม่ ๆ แต่คำแนะนำ regex ของ Mark Canlas นั้นยอดเยี่ยมมากและฉันหวังว่าจะได้มีโอกาสพิสูจน์มัน ขอบคุณทุกคน.


@clockworkgeek - หากคุณขอให้ผู้สมัครทำการย้อนกลับสตริงในภาษาที่พวกเขาชื่นชอบคุณจะแปลกใจว่ามีกี่คนที่ไม่ได้คิดฟังก์ชั่นพื้นฐานที่คุณพูดถึง จากนั้นมีกี่ลูปที่ไม่สามารถใช้ลูปเพื่อนำมาใช้เองได้
justkt

@justkt - นั่นเป็นคำถามอื่นที่รอให้เกิดขึ้น แต่อาจเป็นหัวข้อสำหรับ TopCoder แทน
clockworkgeek

6
ในการส่งข้อความที่สามารถอ่านได้ในกระจกมองหลังขณะขับรถตำรวจจึงไม่สังเกตเห็น
JeffO

@justkt - ถ้าฉันต้องเขียนวนซ้ำเพื่อทำมันฉันจะเริ่มต้นตรงข้ามจบการแลกเปลี่ยนตัวอักษรจนกว่าจะถึงกลาง แต่คุณจะสลับสองค่าได้อย่างไร นี่เป็นเพียงคำตอบที่ดีที่สุดที่ฉันเคยได้รับ:a ^= b; b ^= a; a ^= b;
clockworkgeek

1
ฉันใช้การกลับรายการสตริงสำหรับการย้อนกลับสตริง;)
Muad'Dib

คำตอบ:


19

Sexegers

บางครั้งปัญหาที่เกี่ยวข้องกับนิพจน์ทั่วไปสามารถเขียนได้ง่ายขึ้นโดยให้สตริงอินพุตย้อนกลับและแก้ไขปัญหาด้วยวิธีอื่น

มารยาททางเทคนิคของคนที่สอนฉัน Perl

Sexeger บน PerlMonks


ขอขอบคุณ. เคล็ดลับที่มีประโยชน์มากสำหรับการค้นหาสิ่งสุดท้าย บันทึกรับรองสำเนาถูกต้อง.
clockworkgeek

ฉันทำสิ่งนี้มาหลายปีแล้ว ช่วยในการแยกที่อยู่อีเมล
พะยอม

23

นี่เป็นคำตอบที่ลิ้น - แก้ม

"ย้อนกลับไปในวันนี้" ฉันเป็นเจ้าของกล่อง Unix และมันมีไฟล์พจนานุกรมคำสั่งภาษาอังกฤษที่ใช้สำหรับตรวจการสะกดคำ

ฉันสร้างไฟล์ใหม่ด้วยการกลับคำทั้งหมดในพจนานุกรมเรียงลำดับแล้วย้อนกลับอีกครั้ง ผลลัพธ์คือรายการของคำที่เรียงลำดับจากขวาไปซ้าย

ดังนั้นหากคุณค้นหาด้วยคำถัดจากคำนั้นจะเป็นคำที่ลงท้ายด้วยคำที่คล้ายคลึงกัน มันง่ายมากที่จะสร้างบทกวีเล็ก ๆ !

คุณสามารถสนุกกับตัวเองเมื่อคุณเห็นสิ่งที่คล้องจองกับอะไร


13

ฉันได้รับ coder / พัฒนา / ดูแลระบบสำหรับ ~ 10 ปีและผมจำไม่ได้ว่าเคยต้องสตริงกลับรายการในสถานการณ์จริง

กรณีใช้งานทันทีที่ฉันนึกได้คือการแปลงฐานตัวเลข: ทำอย่างไร้เดียงสาโพรซีเดอร์ส่งคืนสตริงที่ตรงกันข้าม อย่างไรก็ตามด้วยคณิตศาสตร์คุณสามารถคำนวณจำนวนเนื้อที่ที่ต้องการล่วงหน้าเพื่อให้คุณสามารถเริ่มเติมบัฟเฟอร์จากจุดสิ้นสุด


1
อาจเป็นไปได้ว่าคณิตศาสตร์มีราคาแพงกว่าการย้อนกลับสตริงดังนั้นหลังจากการเปรียบเทียบในแพลตฟอร์มของคุณ (ARM, MIPS, x86) คุณอาจใช้สตริงย้อนกลับ อาจจะ.
Zan Lynx

คุณสามารถเติมบัฟเฟอร์จากจุดสิ้นสุดและใช้ a memmoveเพื่อเริ่มเมื่อเสร็จแล้ว อาจถูกกว่าการคำนวณ log (n) / log (ฐาน) เพื่อคำนวณจำนวนหลักที่จำเป็น
Patrick Schlüter

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

1
ใช่ - จริง ๆ แล้วเรามีการคัดกรองสัมภาษณ์ที่ผู้สมัครเขียนตัวตรวจสอบสีและส่วนใหญ่ทำเช่นนี้ แต่ผมชอบมันได้ดีขึ้นเมื่อผู้สมัครย้ำจาก0ไปn/2และเปรียบเทียบตัวละครในตอนท้ายตรงข้าม
Nicole

@Renesis: คุณยังสามารถทำได้: set p เริ่มต้นของสตริง, q สิ้นสุดของสตริง, while ( (*p == *q) && (p <= q) {p++; q--} return p > q;ใน C และภาษาตัวชี้อื่น ๆ
Michael K

4
ฉันคิดว่าในขณะที่ "ตัวตรวจสอบ palindrome" ไม่มีประโยชน์โดยเฉพาะอย่างยิ่ง "เขียนตัวตรวจสอบ palindrome" อย่างน้อยก็มีวัตถุประสงค์
clockworkgeek

2
ในการสัมภาษณ์พวกเขาขอให้ฉันย้อนกลับสตริงและพวกเขากล่าวว่า "จำไม่ได้ว่าสตริงนี้ย้อนกลับ () ดังนั้นฉันเพิ่งแปลงสตริงเป็นอาร์เรย์ตัวละครและ Array.Reverse
แจ็ค Marchetti

นั่นเป็นการใช้งานที่เฉพาะเจาะจงและไม่ใช่สิ่งที่คุณมักจะพูดว่าคุ้มค่ารวมทั้งในภาษา / ห้องสมุด!
Dan Diplo

8

สัมภาษณ์!

การย้อนกลับสตริง (ในสถานที่หรือไม่) เป็นคำถามสัมภาษณ์ที่พบบ่อยมากสำหรับความรู้การเขียนโปรแกรมขั้นพื้นฐาน ภาษาที่ขาดฟังก์ชั่นในตัวเหล่านี้อาจเป็นเรื่องยาก ผู้สมัครจะต้องรู้อะไรบางอย่าง 1


1: นี่คือคำตอบที่ลิ้น - แก้ม


6

ฉันได้เห็นสถานการณ์ที่แอปพลิเคชันเดสก์ท็อปกำลังพูดคุยกับอุปกรณ์ฝังตัวและได้สลับการสั่งซื้อแบบไบต์ต่อเนื่องตลอดเวลาและข้อมูลถูกย้ายเป็นสตริง สำหรับฉันแล้ว

ฉันจะไม่ใช้สตริงสำหรับแอปพลิเคชันนั้น แต่นั่นเป็นวิธีที่มันเป็น .....


+1 สำหรับคำตอบนี้ อย่างน้อยก็เป็นตัวอย่างที่ใช้งานได้จริงแม้ว่าฉันจะทำมันด้วยวิธีอื่นเช่นกันบางทีโดยการเลือกประเภทดั้งเดิมที่แตกต่างไปจาก enddian
clockgeek

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

ไม่ใช่วิธีที่ดีที่สุดในการทำให้อีเมล์สับสนเนื่องจากเมื่อคุณเพิ่มไปยังคลิปบอร์ด และหากเป็นที่นิยมก็จะถูกตรวจพบโดยบอทขูดอีเมล

ถึงกระนั้นก็ถูกแนะนำคนแนะนำ


1
และการทำให้งงที่นิยมใช้มากที่สุดนั้นได้รับเพียงประโยคเดียวในบทความทั้งหมดนั้น ... การเข้ารหัสเป็นภาพ
clockworkgeek

1
@clockworkgeek มันอาจจะเป็นที่นิยม แต่ IMHO มันเป็นโซลูชั่นที่มีประสิทธิภาพที่สุด - ไม่ใช่เรื่องง่ายที่จะสร้างไม่ฝังใน HTML (ความเร็วการจัดเก็บภาพโหลดเซิร์ฟเวอร์) มองนอกสถานที่ไม่สามารถจัดสไตล์ได้ ด้วย CSS และประสบการณ์ผู้ใช้ที่แย่เหมือนการย้อนกลับสตริงต้องจำและพิมพ์ใหม่อีกครั้ง และอาจมีปัญหามากกว่าที่ฉันไม่ได้คิด
นิโคล

แม้ว่าการใช้ AT และ DOT นั้นเป็นวิธีที่ง่ายที่สุดในการถอดรหัสสำหรับเครื่องเก็บเกี่ยว แต่กลับกลายเป็นว่ามีประสิทธิภาพเกือบสมบูรณ์แบบในการป้องกันการเก็บเกี่ยว บางครั้งการทำให้มันเรียบง่ายไม่ใช่ความคิดที่เลวร้าย
Joeri Sebrechts

5

ASCII ไม่ใช่การเข้ารหัสที่ดีที่สุดสำหรับข้อมูลทางพันธุกรรม (คุณสามารถแพ็คประเภทฐาน ACGT เป็น 2 บิต) บรรจุไว้ในชุด longlongs และคุณจะได้รับ "ตัวอักษร" ทางพันธุกรรม 32 คำต่อคำ DNA สามารถหันกลับมาได้ดังนั้นคุณต้องตรวจสอบ DNA ที่มีต่อทั้งคู่เป็นแบบย้อนกลับของลำดับการทดสอบ ดังนั้นความสามารถในการย้อนกลับจำนวน 2 บิตที่บรรจุจะมีประโยชน์มากสำหรับการวิเคราะห์ทางพันธุกรรมหลายประเภท

ฉันมีไอเท็มเป็นเกณฑ์มาตรฐานสำหรับเอเจนซี่สายลับคุณสามารถย้อนกลับบิตเป็นระยะยาวได้เร็วแค่ไหน วิธีการที่ชัดเจนในการแลกเปลี่ยน 2 บิตต่อครั้งนั้นช้ากว่าวิธีที่เห็นได้ชัดน้อยกว่ามาก สิ่งเหล่านี้เกี่ยวข้องกับอัลกอริธึมบางอย่างที่เรียบร้อยสำหรับการขนย้ายอาเรย์

Tangurena: การดำเนินการที่คุณอ้างถึงเรียกว่าจำนวนประชากร ความต้องการที่คล้ายกันสำหรับข้อมูลที่บรรจุบิตนำไปสู่และนับศูนย์ต่อท้าย มีหลายสิ่งที่เรียบร้อยจริงๆที่สามารถทำกับข้อมูลที่บรรจุบิตได้ การดำเนินการเพียงครั้งเดียวบน longlong คือ 64way data ขนานดังนั้นหากคุณรู้ว่าคุณกำลังทำอะไรคุณสามารถรับประสิทธิภาพที่น่าเหลือเชื่อสำหรับการคำนวณบางประเภท


หัวข้อที่น่าสนใจคุณจะย้อนกลับบิตฟิลด์ได้อย่างไร
clockworkgeek

"คุณจะย้อนกลับบิตฟิลด์ได้อย่างไร"
Omega Centauri

2
วิธีหนึ่งคือการค้นหาตารางคุณสามารถบิตย้อนกลับไบต์โดยใช้ตาราง ดังนั้นคุณสามารถทำเช่นนั้นบนไบต์แต่ละครั้ง นอกจากนี้ยังมีวิธีการย้ายหลายบิตและอีกครั้ง ... ความฉลาดเล็กน้อยและการแลกเปลี่ยน (ขนาดตารางเทียบกับจำนวนการดำเนินการ ฯลฯ ) และคุณสามารถลองปรับได้
Omega Centauri

5

สิ่งใดก็ตามที่ทำงานกับสตริงที่ตรงกันข้ามได้ง่ายกว่า

การทำงานกับจำนวนเต็มเป็นสตริงจะง่ายกว่ามากหากสตริงกลับด้าน ฉันสร้างฟังก์ชั่นห้องสมุดบางอย่างสำหรับการทำคณิตศาสตร์ด้วยจำนวนเต็มขนาดใหญ่และใช้การกลับสตริงเพื่อทำให้ฟังก์ชันทางคณิตศาสตร์ง่ายขึ้น

จริงอยู่ที่ฉันได้ใช้มันสำหรับการหาคำตอบใน Project Euler เท่านั้น แต่ยังคงมีหลักฐานดั้งเดิมอยู่


+1 เมื่อใช้การแทนค่าตัวเลขของสตริงการแสดงแบบย้อนกลับจะมีประโยชน์มาก และโดยปกติแล้วไลบรารีมาตรฐานจะแสดงตัวเลขตามลำดับปกติ
back2dos

3

อาจมีการสนับสนุนหลายภาษาที่มีราคาต่ำสำหรับภาษาที่ใช้ตัวอักษรจากขวาไปซ้าย (เช่นอาหรับ) แทนจากซ้ายไปขวา แน่นอนว่าคุณต้องระวังตัวอักขระเน้นเสียงที่ดัดแปลงตัวละครที่เหมาะสม ...


2

ฉันไม่รู้อาจจะมีคนที่มีความจำเป็นในการเผาไหม้เพื่อตรวจสอบpalindrome ของ ....

ฉันไม่คิดว่ามันไร้ประโยชน์อย่างสมบูรณ์เนื่องจากอาจมีสถานการณ์ที่ต้องย้อนกลับสตริง


คำถามติดตามที่จะเป็นเมื่อคุณเคยต้องการตรวจสอบ palindrome ในโลกแห่งความจริง? อีกครั้งฉันเคยเห็นทุกคนสนใจในบทเรียนอัลกอริทึม
clockworkgeek

เช่นนี้ตัวอย่างเช่น: jimsabo.com/palindrome.html
Darknight

ฉันคิดว่าอาจมีการใช้งานอื่น ๆ แต่เป็นโดเมนเฉพาะ ตัวอย่างเช่นหากการค้นหาสตริงถูกปรับให้เหมาะสมสำหรับการค้นหาไปข้างหน้าและคุณต้องการทำการค้นหาหลายครั้งสำหรับเหตุการณ์ล่าสุดคุณอาจต้องการย้อนกลับก่อน นี่จะเป็นการเพิ่มประสิทธิภาพ แต่ไม่ควรทำจนกว่าจะมีกรณีที่พิสูจน์ได้ ฉันสามารถจินตนาการอัลกอริทึมสำหรับการสร้างแฮชของค่าสตริงที่ต้องการใช้ปลายหางอาจกลับด้านถ้าเกิดขึ้นเพื่อให้มีลักษณะการแฮ็กที่ดีขึ้น
Scott Whitlock

2

ในการประมวลผลภาษาธรรมชาติและการแยกวิเคราะห์บางครั้งการค้นหาสตริงจากจุดเริ่มต้นจนถึงจุดเริ่มต้นง่ายขึ้น การย้อนกลับสตริงจะมีประโยชน์สำหรับการดีบักหรือเป็นทางเลือกอื่นในการเขียนลูป (ย้อนกลับสตริงและจากนั้นวนซ้ำจากดัชนี 0 ถึง n-1)

นอกจากนี้ยังมีบางภาษาที่เขียนจากขวาไปซ้ายดังนั้นคุณสามารถใช้ตัวย้อนกลับสตริงได้หากคุณอยู่ในสภาพแวดล้อมที่ไม่รู้จักภาษา LTR / RTL

สตริง (ในบางภาษา) เป็นอาร์เรย์ของตัวอักษร แต่มันก็อาจจะเป็น paychecks หรือการปรับเปลี่ยนสินค้าคงคลัง ในการวนซ้ำระหว่างสิ่งเหล่านี้คุณอาจทำการคำนวณบางอย่างที่ควรเหมือนกันโดยไม่คำนึงถึงลำดับที่คุณประมวลผล การทดสอบหน่วยทรหดอย่างสมบูรณ์แบบคือการตรวจสอบเพื่อดูว่าการคำนวณนั้นใช้การก้าวไปข้างหน้าหรือย้อนกลับเหมือนกันหรือไม่ สิ่งนี้อาจเห็นได้ชัดเล็กน้อยสำหรับการเติมอาจจะไม่ใช่สำหรับการปฏิบัติการแบบทึบอื่น ๆ


1

สำหรับคอมไพเลอร์?

มันสนุก แต่สัญลักษณ์ส่วนใหญ่ในภาษาจะเริ่มต้นด้วยรูปแบบทั่วไป ผมไม่ได้พูดคุยเกี่ยวกับฮังการีโน้ตที่นี่ แต่ถ้าคุณคิดเกี่ยวกับ namespace / ชั้นเรียนแล้วเป็นจำนวนมากของสัญลักษณ์จริงจะแบ่งปันกันคำนำหน้า

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

ปัญหาคือเมื่อทำการค้นหาแบบไบนารีคำนำหน้าทั่วไปเป็นสิ่งที่แย่ที่สุดที่คุณสามารถทำได้เพราะคุณจะต้องเปรียบเทียบคำนำหน้าเหล่านั้นซ้ำแล้วซ้ำอีก

ในทางกลับกันถ้าคุณดูที่สตริงด้านหลังคุณจะเห็นเอนโทรปีมากขึ้น! และทันใดนั้นการค้นหาแบบไบนารี่ (เหนือ Trie) ก็มีประสิทธิภาพมากขึ้น!

เป็นเรื่องที่ทำให้ฉันสับสนเสมอว่า C + + ชื่อ mangled (โดย gcc) ไม่ได้ถูกย้อนกลับเพื่อใส่ namespace LAST :)


0

ฉันพลิกหมายเลขโทรศัพท์และสายอักขระบางอย่างสำหรับการค้นหาเป็นครั้งคราว


0

ครั้งเดียวที่ฉันจำการเห็นการย้อนกลับสตริงที่ใช้อยู่ได้คือฟังก์ชั่นที่ฉันเห็นทางที่ใช้ในขณะที่แยกวิเคราะห์ชื่อไฟล์เพื่อให้แน่ใจว่า '.' พบในชื่อไฟล์เป็นจริงจุดสุดท้ายที่แยกชื่อไฟล์จากนามสกุล นั่นคือการแยกชื่อไฟล์เช่นdata.2010.12.08.datคุณจะย้อนกลับสตริงค้นหาจุดแรกลบตำแหน่งนั้นออกจากจุดสิ้นสุดของสตริงเดิมและนำสตริงย่อย ฉันไม่ได้บอกว่าวิธีที่ดีที่สุดที่จะทำ แต่นั่นคือสิ่งที่มันทำ มันอาจจะอยู่ใน powerbuilder ซึ่งการใช้ฟังก์ชั่นที่แปลก ๆ เหล่านี้เป็นเรื่องธรรมดาในการแก้ไขปัญหาต่างๆที่ไม่ชัดเจน


0

แอพ worls ที่แท้จริงที่ฉันเห็นโดยใช้ strrev คือการจัดเก็บรหัสผ่านของผู้ใช้ที่ 'อ่านไม่ได้' ในฐานข้อมูล ...

แต่ฉันสามารถจำได้ว่ามีรูปแบบใน C เพื่อใช้ strrev บางทีฉันอาจจะเกิดขึ้นในภายหลัง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.