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));
    

      

  • 相关阅读:
    hdu 4117 GRE Words (ac自动机 线段树 dp)
    IT段子,娱乐一下
    makefile 必知必会
    实现跳转到“微信公众账号”并打开添加某个固定微信用户为好友的页面(接口被封了,已经不可用)
    zxing 二维码扫描 配置和使用
    iOS $299刀企业证书申请的过程以及细节补充
    iOS设备的越狱方法
    iOS开发中 workspace 与 static lib 工程的联合使用
    ios如何在当前工程中添加编辑新建的FramesWork
    软件项目版本号的命名规则及格式
  • 原文地址:https://www.cnblogs.com/Answer1215/p/10385636.html
Copyright © 2011-2022 走看看