找不到数组反转算法问题的解决方案。

huangapple go评论105阅读模式
英文:

Can't find a solution for array reverse algorithm problem

问题

I have a requirement where I have to reverse an array without changing the index of '#' presents in an array, like below example:

  • Array [18,-4,'#',0,8,'#',5] should return [5, 8, "#", 0, -4, "#", 18], here numbers should be reversed, excluding '#' while keeping the same index.

I have tried to get the correct output, but it doesn't seem to be correct in all scenarios:

  1. var arr = [18,-4,'#',0,8,'#',5]; // giving result is correct
  2. var arr1 = [18,-4,0,'#',8,'#',5]; // result is not correct
  1. var reverse = function(numbers, start, end){
  2. var temp = numbers[start];
  3. numbers[start] = numbers[end];
  4. numbers[end] = temp;
  5. }
  6. var flip = function(numbers) {
  7. var start = 0;
  8. var end = numbers.length-1;
  9. for(var i=0;i<parseInt(numbers.length/2);i++) {
  10. if(numbers[i] === '#') {
  11. start = i+1;
  12. end = numbers.length - i - i;
  13. reverse(numbers, start, end);
  14. } else if (numbers[numbers.length - i - 1] === '#') {
  15. start = i;
  16. end = numbers.length - i - 2;
  17. reverse(numbers, start, end);
  18. } else {
  19. reverse(numbers, start, end);
  20. }
  21. }
  22. return numbers;
  23. }
  24. var arr = [18,-4,'#',0,8,'#',5];
  25. var arr1 = [18,-4,0,'#',8,'#',5];
  26. console.log(flip(arr));
  27. console.log(flip(arr1));
英文:

I have a requirement where I have to reverse an array without changing the index of '#' presents in an array, like below example:

  • Array [18,-4,&#39;#&#39;,0,8,&#39;#&#39;,5] should return [5, 8, &quot;#&quot;, 0, -4, &quot;#&quot;, 18], here numbers should be reversed, excluding '#' while keeping the same index.

I have tried to get the correct output, but it doesn't seem to be correct in all scenarios:
var arr = [18,-4,'#',0,8,'#',5]; // giving result is correct
var arr1 = [18,-4,0,'#',8,'#',5]; // result is not correct

<!-- begin snippet: js hide: false console: true babel: false -->

<!-- language: lang-js -->

  1. var reverse = function(numbers, start, end){
  2. var temp = numbers[start];
  3. numbers[start] = numbers[end];
  4. numbers[end] = temp;
  5. }
  6. var flip = function(numbers) {
  7. var start = 0;
  8. var end = numbers.length-1;
  9. for(var i=0;i&lt;parseInt(numbers.length/2);i++) {
  10. if(numbers[i] === &#39;#&#39;) {
  11. start = i+1;
  12. end = numbers.length - i - i;
  13. reverse(numbers, start, end);
  14. } else if (numbers[numbers.length - i - 1] === &#39;#&#39;) {
  15. start = i;
  16. end = numbers.length - i - 2;
  17. reverse(numbers, start, end);
  18. } else {
  19. reverse(numbers, start, end);
  20. }
  21. }
  22. return numbers;
  23. }
  24. var arr = [18,-4,&#39;#&#39;,0,8,&#39;#&#39;,5];
  25. var arr1 = [18,-4,0,&#39;#&#39;,8,&#39;#&#39;,5];
  26. console.log(flip(arr));
  27. console.log(flip(arr1));

<!-- end snippet -->

答案1

得分: 2

你可以简化这个函数,只使用两个索引,起始和结束,检查索引处的值是否应该保持不变,然后选择另一个索引进行交换。

  1. const
  2. swap = (array, a, b) => [array[a], array[b]] = [array[b], array[a]],
  3. flip = numbers => {
  4. var start = 0,
  5. end = numbers.length - 1;
  6. while (start < end) {
  7. if (numbers[start] === '#') {
  8. start++;
  9. continue;
  10. }
  11. if (numbers[end] === '#') {
  12. end--;
  13. continue;
  14. }
  15. swap(numbers, start++, end--);
  16. }
  17. return numbers;
  18. },
  19. array1 = [18, -4, '#', 0, 8, '#', 5],
  20. array2 = [18, -4, 0, '#', 8, '#', 5];
  21. console.log(...flip(array1));
  22. console.log(...flip(array2));

注意:我保留了代码中的特殊字符和标记,如#,没有进行翻译。

英文:

You could simplify the function and use only two indices, the start and end and check if the value at the indices should stay, then choose another index for swapping.

<!-- begin snippet: js hide: false console: true babel: false -->
<!-- language: lang-js -->
const
swap = (array, a, b) => [array[a], array[b]] = [array[b], array[a]],
flip = numbers => {
var start = 0,
end = numbers.length - 1;

  1. while (start &lt; end) {
  2. if (numbers[start] === &#39;#&#39;) {
  3. start++;
  4. continue;
  5. }
  6. if (numbers[end] === &#39;#&#39;) {
  7. end--;
  8. continue;
  9. }
  10. swap(numbers, start++, end--);
  11. }
  12. return numbers;
  13. },
  14. array1 = [18, -4, &#39;#&#39;, 0, 8, &#39;#&#39;, 5],
  15. array2 = [18, -4, 0, &#39;#&#39;, 8, &#39;#&#39;, 5];
  16. console.log(...flip(array1));
  17. console.log(...flip(array2));

<!-- end snippet -->

答案2

得分: 2

以下是翻译好的部分:

"The trivial approach would be to remove all &#39;#&#39;'s, reverse the array using the built-in [].reverse method, and then re-insert the &#39;#&#39;'s:

<!-- begin snippet: js hide: false console: true babel: false -->

<!-- language: lang-js -->

  1. let flip = numbers =&gt; {
  2. let removed = numbers.reduce((r, v, i) =&gt;
  3. v === &#39;#&#39; ? r.concat(i) : r
  4. , []);
  5. let reversed = numbers.filter(v =&gt; v !== &#39;#&#39;).reverse();
  6. removed.forEach(i =&gt; reversed.splice(i, 0, &#39;#&#39;));
  7. return reversed;
  8. };
  9. let arr = [18, -4, &#39;#&#39;, 0, 8, &#39;#&#39;, 5];
  10. let arr1 = [18, -4, 0, &#39;#&#39;, 8, &#39;#&#39;, 5];
  11. console.log(flip(arr));
  12. console.log(flip(arr1));

<!-- end snippet -->"

请注意,我已经忽略了代码部分,只翻译了您提供的文字。

英文:

The trivial approach would be to remove all &#39;#&#39;'s, reverse the array using the built in [].reverse method, and then re-insert the &#39;#&#39;'s:

<!-- begin snippet: js hide: false console: true babel: false -->

<!-- language: lang-js -->

  1. let flip = numbers =&gt; {
  2. let removed = numbers.reduce((r, v, i) =&gt;
  3. v === &#39;#&#39; ? r.concat(i) : r
  4. , []);
  5. let reversed = numbers.filter(v =&gt; v !== &#39;#&#39;).reverse();
  6. removed.forEach(i =&gt; reversed.splice(i, 0, &#39;#&#39;));
  7. return reversed;
  8. };
  9. let arr = [18, -4, &#39;#&#39;, 0, 8, &#39;#&#39;, 5];
  10. let arr1 = [18, -4, 0, &#39;#&#39;, 8, &#39;#&#39;, 5];
  11. console.log(flip(arr));
  12. console.log(flip(arr1));

<!-- end snippet -->

答案3

得分: 1

你可以尝试这样做:

  1. var numbers = arr.filter(a => a !== '#')
  2. var revArr = [];
  3. arr.forEach((currentValue) => {
  4. if(currentValue !== "#") {
  5. revArr.push(numbers.pop());
  6. } else {
  7. revArr.push("#");
  8. }
  9. });
英文:

You can try this:

  1. var numbers = arr.filter(a =&gt; a !== &#39;#&#39;)
  2. var revArr = [];
  3. arr.forEach((currentValue) =&gt; {
  4. if(currentValue !== &quot;#&quot;) {
  5. revArr.push(numbers.pop());
  6. } else {
  7. revArr.push(&quot;#&quot;);
  8. }
  9. });

答案4

得分: 1

你可以基于两个基本数组来设计你的算法(一个是包含反转数字的数组,另一个是包含保存位置的"#"的数组)。

  1. const array = [5, 8, "#", 0, -4, "#", 18];
  2. function flip(array) {
  3. const arrayNumbers = array.filter((el, index) => el !== "#").reverse();
  4. var counter = 0;
  5. return array.map(el => el === "#").map(el => {
  6. if (!el) {
  7. let num = arrayNumbers[counter];
  8. counter = counter + 1;
  9. return num;
  10. } else {
  11. return "#";
  12. }
  13. })
  14. }
  15. console.log(flip(array));

希望这有帮助。

英文:

You can base your algorithm on two basic array (array of reversed numbers and and an array with "#" saved positions)

<!-- begin snippet: js hide: false console: true babel: false -->

<!-- language: lang-js -->

  1. const array = [5, 8, &quot;#&quot;, 0, -4, &quot;#&quot;, 18];
  2. function flip(array) {
  3. const arrayNumbers = array.filter((el, index) =&gt; el !== &quot;#&quot;).reverse();
  4. var counter = 0;
  5. return array.map(el =&gt; el === &quot;#&quot;).map(el =&gt; {
  6. if (!el) {
  7. let num = arrayNumbers
    0
    +
    网站访问量
    ;
  8. counter = counter + 1;
  9. return num;
  10. } else {
  11. return &quot;#&quot;
  12. }
  13. })
  14. }
  15. console.log(flip(array));

<!-- end snippet -->

答案5

得分: 0

Here's the translated code portion:

  1. var arr = [18, -4, '#', 0, 8, '#', 5];
  2. var stack = [];
  3. for (i = 0; i < arr.length; i++) {
  4. if (arr[i] == '#') continue;
  5. stack.push(arr[i]);
  6. }
  7. for (i = 0; i < arr.length; i++) {
  8. if (arr[i] != '#') {
  9. arr[i] = stack.pop();
  10. }
  11. }
  12. console.log(arr);

Please note that the code has been translated, and I've excluded the additional explanations and comments.

英文:
  1. var arr = [18,-4,&#39;#&#39;,0,8,&#39;#&#39;,5]
  2. var stack = []
  3. for (i=0 ; i&lt;arr.length; i++) {
  4. if (arr[i] == &#39;#&#39;) continue;
  5. stack.push(arr[i]);
  6. }
  7. for (i=0 ; i&lt;arr.length; i++) {
  8. if (arr[i] != &#39;#&#39;) {
  9. arr[i] = stack.pop();
  10. }
  11. }
  12. console.log(arr)

The above code should solve your problem.
<br>
The implementation uses stack where we keep inserting elements into stack untill we see a '#' and skip it.
While creating the output array we refer the original array for '#' index and stack for reverse index.

答案6

得分: 0

这部分的代码可以这样做:

  1. int end = v.length - 1;
  2. int start = 0;
  3. for (int i = 0; i < v.length >> 1; i++) {
  4. if (v[start].equals("#")) {
  5. start++;
  6. continue;
  7. }
  8. if (v[end].equals("#")) {
  9. end--;
  10. continue;
  11. }
  12. Object temp = v[end];
  13. v[end] = v[start];
  14. v[start] = temp;
  15. end--;
  16. start++;
  17. }
  18. System.out.println(Arrays.toString(v));
英文:

You can do it like this.

  1. int end = v.length - 1;
  2. int start = 0;
  3. for (int i = 0; i &lt; v.length &gt;&gt; 1; i++) {
  4. if (v[start].equals(&quot;#&quot;)) {
  5. start++;
  6. continue;
  7. }
  8. if (v[end].equals(&quot;#&quot;)) {
  9. end--;
  10. continue;
  11. }
  12. Object temp = v[end];
  13. v[end] = v[start];
  14. v[start] = temp;
  15. end--;
  16. start++;
  17. }
  18. System.out.println(Arrays.toString(v));
  19. </details>

huangapple
  • 本文由 发表于 2020年1月6日 22:55:04
  • 转载请务必保留本文链接:https://go.coder-hub.com/59614243.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定