这是从pramp网站上获取的,我正在尝试遵循他们的psudo代码,这是对以下问题的解答。
**
系统会给您一个字符数组arr,该数组由以下各项组成: 字符之间用空格分隔。每个空格定界 字符序列定义一个单词。实现功能 reverseWords反转数组中单词在数组中的顺序 最有效的方式。
**
示例:
input: arr = [ 'p', 'e', 'r', 'f', 'e', 'c', 't', ' ',
'm', 'a', 'k', 'e', 's', ' ',
'p', 'r', 'a', 'c', 't', 'i', 'c', 'e' ]
output: [ 'p', 'r', 'a', 'c', 't', 'i', 'c', 'e', ' ',
'm', 'a', 'k', 'e', 's', ' ',
'p', 'e', 'r', 'f', 'e', 'c', 't' ]
这是我的代码。可以。
using System;
using System.Linq;
using Microsoft.VisualStudio.TestTools.UnitTesting;
namespace StringQuestions
{
[TestClass]
public class ReverseSentanceTest
{
[TestMethod]
public void ManyWordsTest()
{
char[] inputArray = {
'p', 'e', 'r', 'f', 'e', 'c', 't', ' ',
'm', 'a', 'k', 'e', 's', ' ',
'p', 'r', 'a', 'c', 't', 'i', 'c', 'e'
};
char[] expectedOutputArr = {'p', 'r', 'a', 'c', 't', 'i', 'c', 'e', ' ',
'm', 'a', 'k', 'e', 's', ' ',
'p', 'e', 'r', 'f', 'e', 'c', 't'};
char[] outputArr = ReserverseSentence(inputArray);
CollectionAssert.AreEqual(expectedOutputArr, outputArr);
}
[TestMethod]
public void OneWordTest()
{
char[] inputArray = {
'p', 'e', 'r', 'f', 'e', 'c', 't',
};
char[] expectedOutputArr = {
'p', 'e', 'r', 'f', 'e', 'c', 't'};
char[] outputArr = ReserverseSentence(inputArray);
CollectionAssert.AreEqual(expectedOutputArr, outputArr);
}
public char[] ReserverseSentence(char[] inputArr)
{
if (inputArr == null || inputArr.Length == 0)
{
throw new ArgumentException("array is empty");
}
MirrorArray(inputArr, 0, inputArr.Length-1);
int indexStart = 0;
for (int i = 0; i < inputArr.Length; i++)
{
//end of a word in the middle of the sentence
if (inputArr[i] == ' ')
{
MirrorArray(inputArr, indexStart, i - 1);
indexStart = i+1; //skip the white space and start from the letter after
}
else if (i == inputArr.Length - 1)
{
MirrorArray(inputArr, indexStart, i);
}
}
return inputArr;
}
private void MirrorArray(char[] inputArr, int start, int end)
{
while (start < end)
{
var temp = inputArr[start];
inputArr[start] = inputArr[end];
inputArr[end] = temp;
start++;
end--;
}
}
}
}
但是我想我错过了一个极端情况。他们的伪代码有3个if / else分支。我只是以一个整数开头,在这个整数中,他们使用类似nullable<int>
之类的东西。
function reverseWords(arr):
# reverse all characters:
n = arr.length
mirrorReverse(arr, 0, n-1)
# reverse each word:
wordStart = null
for i from 0 to n-1:
if (arr[i] == ' '):
if (wordStart != null):
mirrorReverse(arr, wordStart, i-1)
wordStart = null
else if (i == n-1):
if (wordStart != null):
mirrorReverse(arr, wordStart, i)
else:
if (wordStart == null):
wordStart = i
return arr
# helper function - reverses the order of items in arr
# please note that this is language dependent:
# if are arrays sent by value, reversing should be done in place
function mirrorReverse(arr, start, end):
tmp = null
while (start < end):
tmp = arr[start]
arr[start] = arr[end]
arr[end] = tmp
start++
end--
能否请您解释一下我是否缺少一些特殊情况?并举一个例子。谢谢!
答案 0 :(得分:1)
在以下代码中,您将indexStart
设置为空格后的一个字母:
if (inputArr[i] == ' ')
{
MirrorArray(inputArr, indexStart, i - 1);
indexStart = i+1; //skip the white space and start from the letter after
}
不是将indexStart
设置为未初始化的变量,而是先检查变量是否未初始化,然后使用下一个新单词数组中的位置对其进行初始化,如下所示:
wordStart = null
for i from 0 to n-1:
if (arr[i] == ' '):
if (wordStart != null):
mirrorReverse(arr, wordStart, i-1)
wordStart = null
您可以执行以下操作:将indexStart
设置为-1
,然后在循环中检查indexStart
的值是否为-1
,并以此来表明您拥有开始一个新单词,并可以在数组(arr
)中记录索引。您可以这样:
int indexStart = -1;
for (int i = 0; i < inputArr.Length; i++)
{
//end of a word in the middle of the sentence
if (inputArr[i] == ' ')
{
MirrorArray(inputArr, indexStart, i - 1);
indexStart = -1; //ready to record next index of new word
}
else if (i == inputArr.Length - 1)
{
MirrorArray(inputArr, indexStart, i);
}
else
{
if(indexStart < 0)
indexStart = i; //index of new word
}
}
关键是将indexStart
设置为一个不会在循环内自然设置的值,例如-1
,如果要使用可为null的类型,例如null
int?
,但您必须先检查一个值,然后再尝试访问它,以避免NullReferenceExceptions
,使用-1