给你一个等分的字符串并将其反转

问题描述

let n = "jsdfnsgnlewnl";
let l = n.length;
let trgt = Math.floor((l-1)/2);


function firstHalf(anyhting){
  let ans = [];
  for (i = trgt; i>=0; i--){
    ans.push(n[i])
  }
  return ans;
}


function lastHlaf (anyhting){
  let ansx = [];
  for (i=l-1; i>=trgt+1; i--){
    ansx.push(n[i])
  }
  return ansx;
}

let answer = firstHalf(n);
let answerx = lastHlaf(n);
let newAnswer = answer.join("");
let newAnswerx = answerx.join("");
console.log(newAnswer+newAnswerx)

在这代码中,输出应该是 -> snfdsjglnweln

但它正在给予 --> gsnfdsjlnweln

谁能帮我解释一下。

谢谢 例如--> //如果输入像xyzakig一样奇数 //那么中间值不应该改变请帮我理解这个问题

解决方法

Aaaahhh,您对奇数 字符串长度的评论,我想我现在明白您的问题了。因此我编辑了我最初的答案。

  1. 初始字符串 jsdfnsgnlewnl 分成两部分

    我们得到左半部 jsdfns右半部 nlewnl

  2. 然后反转每个块单独

    我们得到 snfdsjlnweln

  3. 检查初始字符串长度是否是奇数

    如果是这样,我们定义中间元素,这里g

  4. 然后加入 2 个字符串(或 3 个字符串,如果是奇数)

    我们得到 snfdsjglnwelng

现在我们得到您请求的结果:snfdsjglnweln

以下代码将为您提供预期的输出:

let n = "jsdfnsgnlewnl";
let l = n.length;
let trgt = Math.floor(l/2); // '(l/2) instead of '((l-1)/2)'

let even = Number.isInteger(l/2); // check if 'l' is an even number

function firstHalf(anyhting){
  let ans = [];                 // index 'i' is zero-based:  
  for (i = trgt-1; i>=0; i--){  // 'trgt-1' instead of 'trgt'
    ans.push(n[i])
  }
  return ans;
}

function lastHalf (anyhting){  // corrected typo: 'lastHalf' instead of 'lastHlaf'
  let ansx = [];
  for (i=l-1; i>l-1-trgt; i--){ // 'i>l-1-trgt' instead of 'i>=trgt-1'
    ansx.push(n[i])
  }
  return ansx;
}

let answerMiddle = "";
if (!even) answerMiddle = n[trgt]; // define the "letter in the middle" if odd


let answer = firstHalf(n);
let answerx = lastHalf(n);
let newAnswer = answer.join("");
let newAnswerx = answerx.join("");

console.log(newAnswer + answerMiddle + newAnswerx)  // add also '+answerMiddle'

我也对偶数字符串长度进行了测试 - 有效。希望我现在明白了。