每日编程(十九)--leetcode刷题

题目:反转字符串

题目描述:编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 char[] 的形式给出。

不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。

你可以假设数组中的所有字符都是 ASCII 码表中的可打印字符。

示例 1:

输入:[“h”,“e”,“l”,“l”,“o”]
输出:[“o”,“l”,“l”,“e”,“h”]

分析:只能使用O(1)的额外空间,在原数组进行修改,所以我想到的就是,二分法,交换元素

代码:

func reverseString(s []byte)  {
    n:=len(s)
    j:=1
    var b byte
    for i:=0;i<n/2;i++{
        if s[i]!=s[n-j]{
            b=s[i]
            s[i]=s[n-j]
            s[n-j]=b
        }
        j++
    }
    
}

题目:反转字符串(二)

题目描述:给定一个字符串和一个整数 k,你需要对从字符串开头算起的每个 2k 个字符的前k个字符进行反转。如果剩余少于 k 个字符,则将剩余的所有全部反转。如果有小于 2k 但大于或等于 k 个字符,则反转前 k 个字符,并将剩余的字符保持原样。

示例:

输入: s = “abcdefg”, k = 2
输出: “bacdfeg”

分析:很明显这个涉及到字符串与数组的一个转化,然后在分步进行上述操作,我写的代码比较冗余,为了清楚理解,你可以合并一下

代码:

func reverseStr(s string, k int) string {
    str:=[]byte(s)     
    n:=len(str)
    x:=2*k      
    a:=n/x      //a段正常操作
    b:=n%x    //留下b个数
    flag:=0
    var temp byte
    if b>k{   
        flag=1       //是否剩余多余k个字符
    }
    for i:=0;i<a;i++{        //对前a段进行二分交换
        y:=1 
        for j:=i*x;j<(2*i*x+k)/2;j++{   
            if str[j]!=str[i*x+k-y]{
                temp=str[j]
                str[j]=str[i*x+k-y]
                str[i*x+k-y]=temp
            }
            y++
        }
    }
    if flag==1{            //如果flag==1,就对前k个交换
        y:=1
        for j:=a*x;j<(2*a*x+k)/2;j++{
            if str[j]!=str[a*x+k-y]{
                temp=str[j]
                str[j]=str[a*x+k-y]
                str[a*x+k-y]=temp
            }
            y++
        }
    }else{           //交换剩下的所有
         y:=1
        for j:=a*x;j<(n+a*x)/2;j++{
            if str[j]!=str[n-y]{
                temp=str[j]
                str[j]=str[n-y]
                str[n-y]=temp
            }
             y++
        }
    }
    return string(str)
}

题目:反转字符串(三)

题目描述:给定一个字符串,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序。

示例 1:

输入: “Let’s take LeetCode contest”
输出: “s’teL ekat edoCteeL tsetnoc”
分析:很简单了,先分割,再反转,再合并
代码:

func reverseWords(s string) string {
    str :=[]string{}
    str=strings.Fields(s)
    n:=len(str)
    var temp byte
    for i:=0;i<n;i++{
        b:=[]byte(str[i])
        l:=len(b)
        a:=1
        for j:=0;j<l/2;j++{
            if b[j]!=b[l-a]{
                temp=b[j]
                b[j]=b[l-a]
                b[l-a]=temp
            }
            a++
        }
        str[i]=string(b)
    }
    return strings.Join(str," ")
}

代码看着多,很容易理解。

猜你喜欢

转载自blog.csdn.net/LYue123/article/details/87640698