【问题标题】:How to swap array of characters (in-place) in Java如何在Java中交换字符数组(就地)
【发布时间】:2019-02-20 10:06:48
【问题描述】:

所以基本上不能/被允许创建一个新数组。无法返回任何内容,但实际上更改和操作当前数组。您如何获取一组字符并简单地翻转/反转它们。

Starting array: ['P','e','r','f','e','c','t',' ','M','a','k','e','s',' ','P','r','a','c','t','i','c','e']

将每个以空格分隔的单词反转

Reversed: ['P','r','a','c','t','i','c','e',' ','M','a','k','e','s',' ','P','e','r','f','e','c','t'] 

这是我目前所拥有的

代码:

  class Main {
     public static void main(String[] args) {
       char[] charArr = new char[] {'P','e','r','f','e','c','t',' ','M','a','k','e','s',' ','P','r','a','c','t','i','c','e'};
       reverseCharArray(charArr);
     }


     public static void reverseCharArray() {
       int arrLength = charArr.length;
       for (int i = 0; i <= arrLength / 2; i++) {
         charArr[arrLength - i - 1] = charArr[i];
         System.out.println(charArr);
       }
     }
   }

更新: 好的,我发现就是这样。我需要做的实际上是交换字符的句子拼写的单词。使句子倒转/倒转。

注意:这是在一次在线采访中尝试的: enter link description here

【问题讨论】:

  • 这里有很多问题。首先,您将丢失数据,因为您正在覆盖 char 数组中的数据而不是实际交换。其次,您正在反转整个 char 数组。在您的示例中,您反转了完整的单词而不是字符。
  • @Hunter 你想交换两个区间还是反转整个数组?
  • 反转整个数组@IvanKukic
  • @Hunter 您的示例输入/输出表明您只交换了数组中的一些字符,'M', 'a', 'k', 'e', 's' 根本没有移动。
  • 如果你反转整个数组,你会得到['e','c','i','t','c','a','r','P',' ','s','e','k','a','M',' ','t','c','e','f','r','e','P'],而不是问题中的内容

标签: java arrays char reverse


【解决方案1】:

这绝对不是一个好的解决方案,但它是一个有效的解决方案。

class Main {

public static void main(String[] args) {
    char[] charArr = new char[] { 'P', 'e', 'r', 'f', 'e', 'c', 't', ' ', 'M', 'a', 'k', 'e', 's', ' ', 'P', 'r',
            'a', 'c', 't', 'i', 'c', 'e' };
    System.out.println(charArr);
    reverseCharArray(charArr,0);
    System.out.println(charArr);
}


public static void reverseCharArray(char[] charArr, int sorted) {


    /* Look for last space*/
    int lastSpace = -1;
    for (int i = 0; i < charArr.length; i++) { 
        if (charArr[i] == ' ') {
            lastSpace = i; 
        }
    }

    /* Grab the word and move it at the beginning of the sorted array */
    for (int i = lastSpace + 1; i < charArr.length; i++) {

        int k = i;

        while (k != sorted) {
            char tmp = charArr[k-1];
            charArr[k-1] = charArr[k];
            charArr[k] = tmp;
            k--;
        }

        sorted++;
    }


    /* At this point, the last character is a space*/
    /* Else, we've swapped all the words */
    int k = charArr.length - 1;
    if (charArr[k] != ' ') {
        return;
    }

    /* If it's a space, grab it and move it at the beginning*/
    while (k != sorted) {
        char tmp = charArr[k-1];
        charArr[k-1] = charArr[k];
        charArr[k] = tmp;
        k--;
    }
    sorted++;


    /*Recursive call on the not sorted array*/
    reverseCharArray(charArr,sorted);

}}

【讨论】:

  • 哇,它确实有效,它交换句子说熟能生巧!顺便说一句,这是这里唯一成功的解决方案,顺便说一句,干得好!
【解决方案2】:

下面的方法交换间隔。请注意,它们的长度必须相同。

public static char[] swap(char[] arr, int lstart, int rstart, int len){
      for(int i=lstart; i<lstart+len; i++){
        char temp = arr[i];
        arr[i] = arr[rstart+i];
        arr[rstart+i] = temp;
   }
   return arr;
}

【讨论】:

  • 我去试一试,顺便问一下lstart和rstart是什么?
  • @Hunter 我现在修好了,它可以工作了。 Lstart 是“左”区间开始的索引,“rstart”是右区间的开始索引。例如,如果我有A B C D E 并想将ABD E 交换,我会将该函数称为 (arr, 0, 3 ,2)。 0 - 左区间的开始,3 - 右区间的开始,2 - 区间的长度。
  • 哦,我明白了,这就像我正在寻找的内容的基本版本,所以基本上如果我有 2 个长度相同的单词,我可以交换这 2 个
  • 是的,但是在您在说明中进行编辑后,它似乎并没有解决您的问题。
  • 这是一个非常酷的功能,虽然我会投赞成票。它可能会帮助其他人,谁知道
【解决方案3】:

假设您有以下数组; [h, e, y, , y, o, u] 你必须按照模式工作;从外到内(或相反)。所以,[1,2,3,4,3,2,1] 你必须交换1122 等等。如您所见,该数组的长度为 7,在这种情况下,所需的交换量正好是 4(4 与其自身交换)。要计算交换量,您可以简单地将数组长度除以2.0f

现在您必须循环遍历数组,交换这些索引。要计算要交换的索引,您必须检查您的交换位置。假设你在第二次交换,数组中2 的索引是1 和5,3 的索引是2 和4。你现在可能已经认出了这个模式。第一个索引始终是已完成交换的数量,第二个是数组的长度减去 1 减去已完成交换的数量。

这是放入代码的;


    public static void swap(char[] array){
        int totalSwaps = (int) Math.ceil(array.length / 2.0f);
        for(int currentSwaps = 0; currentSwaps < totalSwaps; currentSwaps++){
            char char1 = array[currentSwaps];
            int position2 = array.length - (currentSwaps + 1);
            array[currentSwaps] = array[position2];
            array[position2] = char1;
        }
        System.out.println(Arrays.toString(array));
    }

编辑:我刚刚看到您要求反转 char[] 中的每个单词,您可能想在第一句话中澄清这一点

这样做;我建议您使用 String::split 将字符串拆分为 string[] 并使用 String::toCharArray 将其更改为字符数组。虽然这确实会创建新数组

【讨论】:

    【解决方案4】:

    对此有一个算法,如下,

    1. 最初,将给定字符串的单个单词反转一个 一,对于提供的示例"Perfect Makes Practice",在反转单个单词后,字符串应该是“tcefreP sekaM ecitcarP”
    2. 从头到尾反转整个字符串以获得所需的输出 "Practice Makes Perfect" 在上面的例子中。

    更多信息请查看Reverse words in a given string

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-27
      • 1970-01-01
      • 2016-09-16
      • 2021-05-06
      相关资源
      最近更新 更多