修剪字符数组

5
背景:我被邀请去一家高知名度公司的面试,面试官在告诉我没有通过此次C#,mvc3,razor职位的面试之前问了我以下问题。 我真的很想知道如何解决这个问题。
问题:“编写一个方法,该方法接受字符数组,修剪空格并返回相同的数组。” 经过一些思考,我被告知将空格替换为“\ o”。
我从以下内容开始:
public static char[] Trim(char[] c)
    {
        for (int i = 0; i < c.Length; i++)
        {
            if (c[i] == '\r' || c[i] == '\n' || c[i] == '\t')
            {
                c[i] = '\o';
            }     
        }
    }

有人告诉我必须使用同一个数组,不能将其放入列表并调用ToArray()。然而,如果数组保持相同的大小,则无法“修剪”它。


4
这个问题的措辞不太好……一些面试官会故意问这样的问题,以查看您是否愿意提出问题。只是一个小小的面试提示。当我面试亚马逊时,他们多次改变想法,只是为了看看我是否会生气。 - Codeman
1
好的,不要沮丧。在多个层面上,这对我来说似乎是一个可怕的面试问题。(1.人为制造和荒谬地使用相同的字符数组2.一开始使用字符数组很傻3.试图把C#中的空终止字符串的概念硬塞进去只会让人感到恶心4.这根本不是什么难题;只是一个“陷阱”问题,试图诱捕你。) - Kirk Woll
1
@Pheonixblade9 我同意他可能想看看我问了什么问题。相信我,我确实问了,这似乎让他更生气了。我不是因为被问到那个问题而生气,我想知道为什么我通过了人力资源和技术电话面试,被要求参加面试,却在一个问题后被告知被拒绝了。 - The Muffin Man
4
他们因为你没有回答这个措辞不当的问题而严重拒绝了你吗?也许你不想为他们工作,否则你六个月后就会满头白发。 - Codeman
我看到了你的问题。你没有在正确的时候让它进行FizzBuzz :-) - SleepyBoBos
显示剩余5条评论
5个回答

6
他们可能是指\0(NUL字符),而不是破折号-0。

3
假设他们的意思是用null字符替换空白字符,那么解决方案很简单:
步骤1:从字符串的开头(表示为字符数组)开始,替换空白字符,直到遇到非空白字符。
步骤2:从字符串的末尾开始向后工作,执行相同的操作。
public static void Trim( Char[] chars )
{        
    int maxIdx = 0; // an optimization so it doesn't iterate through chars already encountered
    for( int i = 0;i < chars.Length; i++ )
    {
        if( Char.IsWhitespace( chars[i] ) )
        {
            chars[i] = '\0';
        }
        else
        {
            maxIdx = i;
            break;
        }
    }

    for( int i = chars.Length - 1; i > maxIdx; i-- )
    {
        if( Char.IsWhitespace( chars[i] ) ) chars[i] = '\0';
    }
}

David,我忘了提到我还必须将所有的'\o'字符移动到最后。 - The Muffin Man

2
public static char[] Trim(char[] str)
{
  return str.Where(x => !Char.IsWhiteSpace(x)).ToArray();
}

1
请纠正我,但这将在内部创建一个没有空格字符的新字符数组。 - The Muffin Man
是的 - 但回答了问题。他们给你的示例没有修剪空格,而是将字符设置为 null 字符。 - BlackSpy
问题说明我不能返回一个新的数组,必须是同一个数组。 - The Muffin Man
哈哈 - 我也会被踢出去的 ;) - BlackSpy

0

这段代码很丑陋且未经测试,但它可以在单次遍历中完成整个操作而不创建新的数组:

public static void Trim(Char[] str) {

    int nonNullIndex = 0;
    int lastNonNullIndex = 0;

    for(int i=0;i<str.Length;i++) {
        str[nonNullIndex] = str[i];
        if( !Char.IsWhitespace( str[i] ) || nonNullIndex > 0) nonNullIndex++;
        if( !Char.IsWhitespace( str[i] )) lastNonNullIndex = i;
    }
    nonNullIndex++
    str[lastNonNullIndex] = '\0';

}

0

我猜你被要求从字符串中删除空格,然后将剩余元素填充到字符数组中,用'\0'代替。

例如,将“Convert this string”转换为“Convertthisstring”,并使用2个'\0'填充其余的数组。

解决方法:

    char[] TrimWhiteSpace(char[] source)
    {
        int i, j = 0;

        for (i = 0; i < source.Length; i++)
        {
            if (!char.IsWhiteSpace(source[i]))
            {
                source[j] = source[i];
                j++;
            }
        }

        for (int x = 0; x < (i - j); x++)
        {
            source[j + x] = '\0';
        }

        return source;
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接