逆转Java中的句子

作为

我在程序中插入了一个字符串

String str = " I live in India"; 

怎样才能得到像这样的反向字符串

String str ="India in live I"

这是我面试中的一个面试问题。请任何人可以帮助我解决这个问题

康斯坦丁·约夫科夫(Konstantin Yovkov)

拆分它,然后String以相反的顺序将其添加到新的对象中。

String s = " I live in India";
String[] split = s.split(" ");
String result = "";
for (int i = split.length - 1; i >= 0; i--) {
  result += (split[i] + " ");
}
System.out.println(result.trim());

打印:

India in live I

尽管简短明了,但此解决方案在时间和内存方面并没有真正有效。这在某种程度上取决于输入的给出方式(作为aString或其他形式)以及我们是否可以修改输入以节省计算资源。

假设该句子以字符数组形式给出,我们可以对其进行修改。然后,我们可以采用以下方法,这带来了线性时间(O(n))和常数(O(1))的存储复杂性:

我们将得到的输入是:

char[] array = {'I',' ','l','i','v','e',' ','i','n',' ','I','n','d','i','a'};

让我们写的是需要一种方法char[]阵列和反转的元素start,以end就地:

void reverse(char[] array, int start, int end) {
  while (start < end) {
    char temp = array[start];
    array[start] = array[end];
    array[end] = temp;
    start++;
    end--;
  }
}

首先,我们将使用此方法反转整个数组(就地)。您会注意到,反转之后,句子中的单词以所需(反转)的方式排序。问题在于每个单词都是相反的:

{'a','i','d','n','I',' ','n','i',' ','e','v','i','l',' ','I'}

现在让我们从左到右迭代数组。我们将就地反转每个单词,就像我们最初反转整个数组一样。为此,我们需要保留一个索引(start),告诉一个单词从何处开始,并且每次遇到空格(' ')时,我们都会在start和空格之前的字符之间触发一个反向操作这样,我们将保持所需的单词顺序,但是我们也将使单词中的字符正确排序。

该代码应该是不言自明的:

void reverseSentence(char[] array) {
  int n = array.length;
  reverse(array, 0, n - 1);
  int start = 0;
  for (int i = 0; i < n; i++) {
    if (array[i] == ' ') {
      reverse(array, start, i - 1);
      start = i + 1;
    }
  }
}

在初始位置调用此代码array,我们得到:

{'I','n','d','i','a',' ','i','n',' ','l','i','v','e', ' ','I'}

我们可以进一步构造String出它,或者只是打印出来。在任何情况下,该句子都可以根据需要反转。

这具有线性复杂度(O(n)),因为每个字符仅是反向字符的一部分,并且正被测试为仅一次是空格。

至于内存使用情况,我们仅使用了一个附加变量(start),这使总内存复杂度变为常数(O(1))。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章