代码随想录算法训练营第八天| 344. 反转字符串、541.反转字符串II、剑指 Offer 05. 替换空格、151. 反转字符串中的单词、剑指 Offer 58 - II. 左旋转字符串

344. 反转字符串

思路: 双指针法

public void ReverseString(char[] s) {
        int left = 0;
        int right = s.Length-1;
        while (left < right)
        {
            char tmp = s[left];
            s[left] = s[right];
            s[right] = tmp;
            left++;
            right--;
        }
    }

541.反转字符串II

public static string ReverseStr(string s, int k)
        {
            char[] data = s.ToCharArray();
            for (int i = 0; i < s.Length; i += 2 * k)//间隔2k
            {
                if (i + k <= s.Length) ReverseString(data, i, i + k - 1);
                else ReverseString(data, i, s.Length-1);
            }
            return new string(data);//char[] to string
        }

        public static void ReverseString(char[] s, int startIdx, int endIdx)
        {
            while (startIdx < endIdx)
            {
                char tmp = s[startIdx];
                s[startIdx] = s[endIdx];
                s[endIdx] = tmp;
                startIdx++;
                endIdx--;
            }
        }

剑指 Offer 05. 替换空格

思路:
思路

public static string ReplaceSpace(string s)
        {
            int len = 0;
            for (int i = 0; i < s.Length; i++)
            {
                if (s[i] == ' ')
                {
                    len += 3;
                }
                else {
                    len++;

                }
            }
            char[] data = new char[len];
            for (int i = len - 1, j = s.Length - 1; i >= 0; i--,j--)
            {
                if (s[j] == ' ')
                {
                    data[i] = '0';
                    data[i - 1] = '2';
                    data[i - 2] = '%';
                    i = i - 2;
                }
                else
                {
                    data[i] = s[j];
                }
            }
            return new string(data);
        }

151. 反转字符串中的单词

思路:

  • 快慢指针移除多余空格
  • 将整个字符串反转
  • 将每个单词反转

举个例子,源字符串为:" the sky is blue "

  • 移除多余空格 : “the sky is blue”
  • 字符串反转:“eulb si yks eht”
  • 单词反转:“blue is sky the”
public static string ReverseWords(string s)
        {
            char[] data = s.ToArray();
            int fast = 0, slow = 0;
            for (; fast < data.Length; fast++)//去除所有空格并在相邻单词之间添加空格, 快慢指针。
            {
                if (data[fast] != ' ')
                {
                    if(slow > 0) data[slow++] = ' ';//手动控制空格,给单词之间添加空格。slow > 0说明不是第一个单词,需要在单词前添加空格。
                    while (fast < data.Length && data[fast] != ' ')
                    {
                        data[slow++] = data[fast++];
                    }
                }
                
            }
            char[] data1 = new char[slow];//slow的大小即为去除多余空格后的大小。
            for (int i = 0; i < data1.Length; i++)
            {
                data1[i] = data[i];
            }
            ReverseString(data1, 0, data1.Length - 1);//先整体反转,再局部反转
            int startIdx = 0;
            for (int i = 0; i <= data1.Length; i++)
            {
                if (i == data1.Length || data1[i] == ' ')//到达空格或者串尾,说明一个单词结束。进行翻转。
                {
                    ReverseString(data1, startIdx, i - 1);//翻转,注意是左闭右闭 []的翻转。
                    startIdx = i + 1;//更新下一个单词的开始下标start
                } 
            }
            return new string(data1);
        }
public static void ReverseString(char[] s, int startIdx, int endIdx)
        {
            while (startIdx < endIdx)
            {
                char tmp = s[startIdx];
                s[startIdx] = s[endIdx];
                s[endIdx] = tmp;
                startIdx++;
                endIdx--;
            }
        }

剑指 Offer 58 - II. 左旋转字符串

思路: 先局部反转,再整体反转

public static string ReverseLeftWords(string s, int n)
        {
            char[] data = s.ToCharArray();
            ReverseString(data, 0, n - 1);
            ReverseString(data, n, data.Length - 1);
            ReverseString(data, 0, data.Length - 1);
            return new string(data);
        }
public static void ReverseString(char[] s, int startIdx, int endIdx)
        {
            while (startIdx < endIdx)
            {
                char tmp = s[startIdx];
                s[startIdx] = s[endIdx];
                s[endIdx] = tmp;
                startIdx++;
                endIdx--;
            }
        }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值