zoukankan      html  css  js  c++  java
  • [Algorithm] Reverse array of Chars by word

    For example we have:

    ["p", "r", "e", "f", "e", "t", " ", "m", "a", "k", "e", " ", "p", "r", "a", "t", "i", " c", "e"]

    We want to get:

    ["p", "r", "a", "t", "i", " c", "e", " ", "m", "a", "k", "e", " ", "p", "r", "e", "f", "e", "t"]

    Requirement:

      You can only do in array swap, you cannot create a new array.

    The way to do it:

      1. Reverse whole string to get:

    ["e", " c", "i", "t", "a", "r", "p", " ", "e", "k", "a", "m", " ", "t", "e", "f", "e", "r", "p"]

      2. Then we reverse each word to get final result:

    ["p", "r", "a", "t", "i", " c", "e", " ", "m", "a", "k", "e", " ", "p", "r", "e", "f", "e", "t"]

    So the main function should looks like this:

    let data = [
      "p","r","e","f","e","t"," ",
      "m","a","k","e"," ",
      "p","r","a","t","i","c","e"
    ];
    
    function main(_data) {
      let data = _data.slice();
    
      reverseWholeString(data);
      reverseWords(data, 0);
    
      return data;
    }
    
    console.log(main(data));

    The reverseWholeString function would be:

    function reverseWholeString(data) {
      let start = 0,
        end = data.length - 1;
      reverseChars(data, start, end);
    }
    
    function reverseChars(data, start, end) {
      while (start < end) {
        [data[start], data[end]] = [data[end], data[start]];
        start++;
        end--;
      }
    }

    reverseWords function would be:

    function reverseWords(data, start) {
      let index = findEmptyIndex(data, start);
      let end = index - 1;
    
      while (index !== -1) {
        reverseChars(data, start, end);
        start = index + 1;
        index = findEmptyIndex(data, start);
        end = index - 1;
      }
    
      reverseChars(data, start, data.length - 1);
    }
    
    function findEmptyIndex(data, start) {
      let index;
      for (let i = start; i < data.length; i++) {
        if (data[i] === " ") {
          index = i;
          break;
        } else {
          index = -1;
        }
      }
    
      return index;
    }

    ------------

    Full code:

    let data = [
      "p",
      "r",
      "e",
      "f",
      "e",
      "t",
      " ",
      "m",
      "a",
      "k",
      "e",
      " ",
      "p",
      "r",
      "a",
      "t",
      "i",
      " c",
      "e"
    ];
    
    function reverseWholeString(data) {
      let start = 0,
        end = data.length - 1;
      reverseChars(data, start, end);
    }
    
    function reverseChars(data, start, end) {
      while (start < end) {
        [data[start], data[end]] = [data[end], data[start]];
        start++;
        end--;
      }
    }
    
    function findEmptyIndex(data, start) {
      let index;
      for (let i = start; i < data.length; i++) {
        if (data[i] === " ") {
          index = i;
          break;
        } else {
          index = -1;
        }
      }
    
      return index;
    }
    function reverseWords(data, start) {
      let index = findEmptyIndex(data, start);
      let end = index - 1;
    
      while (index !== -1) {
        reverseChars(data, start, end);
        start = index + 1;
        index = findEmptyIndex(data, start);
        end = index - 1;
      }
    
      reverseChars(data, start, data.length - 1);
    }
    
    function main(_data) {
      let data = _data.slice();
    
      reverseWholeString(data);
      reverseWords(data, 0);
    
      return data;
    }
    
    console.log(main(data));
    

      

  • 相关阅读:
    P1338 末日的传说
    P1364医院设置
    线程
    进程通信
    CentOS设置中文
    C++快读讲解
    迭代加深搜索
    P1118 [USACO06FEB]Backward Digit Sums G/S
    N皇后问题
    RMQ区间最值查询
  • 原文地址:https://www.cnblogs.com/Answer1215/p/10385636.html
Copyright © 2011-2022 走看看