How to reverse a string in Go?

前端 未结 28 1890
天涯浪人
天涯浪人 2020-12-04 06:45

How can we reverse a simple string in Go?

相关标签:
28条回答
  • 2020-12-04 07:14

    From Go example projects: golang/example/stringutil/reverse.go, by Andrew Gerrand

    /*
    Copyright 2014 Google Inc.
    Licensed under the Apache License, Version 2.0 (the "License");
    you may not use this file except in compliance with the License.
    You may obtain a copy of the License at
         http://www.apache.org/licenses/LICENSE-2.0
    Unless required by applicable law or agreed to in writing, software
    distributed under the License is distributed on an "AS IS" BASIS,
    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    See the License for the specific language governing permissions and
    limitations under the License.
    */
    
    // Reverse returns its argument string reversed rune-wise left to right.
    func Reverse(s string) string {
        r := []rune(s)
        for i, j := 0, len(r)-1; i < len(r)/2; i, j = i+1, j-1 {
            r[i], r[j] = r[j], r[i]
        }
        return string(r)
    }
    

    Go Playground for reverse a string

    After reversing string "bròwn", the correct result should be "nwòrb", not "nẁorb".
    Note the grave above the letter o.


    For preserving Unicode combining characters such as "as⃝df̅" with reverse result "f̅ds⃝a",
    please refer to another code listed below:

    http://rosettacode.org/wiki/Reverse_a_string#Go

    0 讨论(0)
  • 2020-12-04 07:14
    package reverseString
    
    import "strings"
    
    // ReverseString - output the reverse string of a given string s
    func ReverseString(s string) string {
    
        strLen := len(s)
    
        // The reverse of a empty string is a empty string
        if strLen == 0 {
            return s
        }
    
        // Same above
        if strLen == 1 {
            return s
        }
    
        // Convert s into unicode points
        r := []rune(s)
    
        // Last index
        rLen := len(r) - 1
    
        // String new home
        rev := []string{}
    
        for i := rLen; i >= 0; i-- {
            rev = append(rev, string(r[i]))
        }
    
        return strings.Join(rev, "")
    }
    

    Test

    package reverseString
    
    import (
        "fmt"
        "strings"
        "testing"
    )
    
    func TestReverseString(t *testing.T) {
    
        s := "GO je úžasné!"
        r := ReverseString(s)
    
        fmt.Printf("Input: %s\nOutput: %s", s, r)
    
        revR := ReverseString(r)
    
        if strings.Compare(s, revR) != 0 {
            t.Errorf("Expecting: %s\n. Got: %s\n", s, revR)
        }
    }
    

    Output

    Input: GO je úžasné!
    Output: !énsažú ej OG
    PASS
    ok      github.com/alesr/reverse-string 0.098s
    
    0 讨论(0)
  • 2020-12-04 07:16

    In Go1 rune is a builtin type.

    func Reverse(s string) string {
        runes := []rune(s)
        for i, j := 0, len(runes)-1; i < j; i, j = i+1, j-1 {
            runes[i], runes[j] = runes[j], runes[i]
        }
        return string(runes)
    }
    
    0 讨论(0)
  • 2020-12-04 07:16

    A simple stroke with rune:

    func ReverseString(s string) string {
        runes := []rune(s)
        size := len(runes)
        for i := 0; i < size/2; i++ {
            runes[size-i-1], runes[i] = runes[i],  runes[size-i-1]
        }
        return string(runes)
    }
    
    func main() {
        fmt.Println(ReverseString("Abcdefg 汉语 The God"))
    }
    
    : doG ehT 语汉 gfedcbA
    
    0 讨论(0)
  • 2020-12-04 07:17

    Yet Another Solution (tm) :

    package main 
    import "fmt"
    
    type Runes []rune
    
    func (s Runes) Reverse() (cp Runes) {
        l := len(s); cp = make(Runes, l)
        // i <= 1/2 otherwise it will mess up with odd length strings
        for i := 0; i <= l/2; i++ { 
            cp[i], cp[l-1-i] = s[l-1-i], s[i] 
        }
        return cp
    }
    
    func (s Runes) String() string {
        return string(s)
    }
    
    func main() { 
        input := "The quick brown 狐 jumped over the lazy 犬 +odd" 
        r := Runes(input)
        output := r.Reverse()
        valid := string(output.Reverse()) == input
        fmt.Println(len(r), len(output), r, output.Reverse(), valid)
    }
    
    0 讨论(0)
  • 2020-12-04 07:18

    Building on Stephan202's original suggestion, and appears to work for unicode strings:

    import "strings";
    
    func Reverse( orig string ) string {
        var c []string = strings.Split( orig, "", 0 );
    
        for i, j := 0, len(c)-1; i < j; i, j = i+1, j-1 {
            c[i], c[j] = c[j], c[i]
        }
    
        return strings.Join( c, "" );
    }
    

    Alternate, not using strings package, but not 'unicode-safe':

    func Reverse( s string ) string {
        b := make([]byte, len(s));
        var j int = len(s) - 1;
        for i := 0; i <= j; i++ {
            b[j-i] = s[i]
        }
    
        return string ( b );
    }
    
    0 讨论(0)
提交回复
热议问题