2021-03-09

算法打卡

01.03 URL化。

  • 编写一种方法,将字符串中的空格全部替换为%20。假定该字符串尾部有足够的空间存放新增字符,并且知道字符串的“真实”长度。(注:用Java实现的话,请使用字符数组实现,以便直接在数组上操作。)
  1. 方法一, 直接用一个新数据组 将原来字符串翻译后返回。 通用性更好, 支持多个字符替换 。 空间复杂度 O(n) 时间复杂度 O(n)
    public string ReplaceSpaces(string S, int length) 
    {
        var charLength = S.Count(x => x != ' ');
        var chars = new char[charLength + (length - charLength) * 3];
        var k = 0;
        for (int i = 0; i < length; i++)
        {
            if (S[i] == ' ')
            {
                chars[k++] = '%';
                chars[k++] = '2';
                chars[k++] = '0';
            }
            else
            {
                chars[k++] = S[i];
            }
        }

        return new string(chars);
    }
  1. 方法二 ,双指针分别 指向当前字符串索引,跟替换后的索引, 倒序处理。 但是前提条件字符串的末尾空格足够多才行(实际使用场景较小) 空间复杂度 O(1) 时间复杂度 O(n)
    public string ReplaceSpaces(string S, int length) 
    {
          var chars = S.ToCharArray();
          var charLength = S.Count(x => x != ' ');
          var realLength = charLength + (length - charLength) * 3;
          var k = realLength - 1;
          for (int i = length - 1; i != k; i--)
          {
                if (chars[i] == ' ')
                {
                    chars[k--] = '0';
                    chars[k--] = '2';
                    chars[k--] = '%';
                }
                else
                {
                    chars[k--] = chars[i];
                }
          }

          new string(chars, 0, realLength - 1);
    }

1528. 重新排列字符串

  • 给你一个字符串 s 和一个 长度相同 的整数数组 indices 。请你重新排列字符串 s ,其中第 i 个字符需要移动到 indices[i] 指示的位置。返回重新排列后的字符串。
  1. 简单方案
    public string RestoreString(string s, int[] indices) 
    {
        var chars = s.ToCharArray();
        for(var i = 0; i < indices.Length; i++)
        {
            chars[indices[i]] = s[i];
        }
        return new string(chars);
    }
  1. 原址交换
    public string RestoreString(string s, int[] indices) 
    {
        var chars = s.ToCharArray();
        for(var i = 0; i < indices.Length; i++)
        {
            while(indices[i] != i)
            {
              Swap(chars, i,indices[i]);
              Swap(indices, i,indices[i]);
            }

        }
        return new string(chars);
    }

    private void Swap(T[] arr, int a, int b)where T :struct
    {
          var temp = arr[a];
          arr[a] = arr[b];
          arr[b] = temp;
    }

你可能感兴趣的:(2021-03-09)