我在程序中插入了一个字符串
String str = " I live in India";
怎样才能得到像这样的反向字符串
String str ="India in live I"
这是我面试中的一个面试问题。请任何人可以帮助我解决这个问题
拆分它,然后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] 删除。
我来说两句