C#中的Pramp反句面试问题

时间:2018-09-03 21:18:43

标签: c#

这是从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--

能否请您解释一下我是否缺少一些特殊情况?并举一个例子。谢谢!

1 个答案:

答案 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

几乎更好