【问题标题】:Trim a char array修剪一个字符数组
【发布时间】:2012-06-19 22:35:55
【问题描述】:

背景:我被邀请参加一家知名公司的面试,并在被告知我未能通过该职位的面试之前被问到以下问题(C#,mvc3,razor)。 我真的很想知道如何解决这个问题。

问题:"Write a method that takes a char array, trims whitespace, and returns the same array." 经过一番思考,有人告诉我用“\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()。但是我认为如果数组保持相同的大小,就不可能“修剪它”。

【问题讨论】:

  • 这听起来像是一个措辞不好的问题......有些面试官故意问他们,看看你是否愿意提问。只是一点面试技巧。当我采访亚马逊时,他们多次改变主意,只是想看看我是否会生气。
  • 好吧,别失望。在多个层面上,这对我来说似乎是一个糟糕的面试问题。 (1. 使用/返回相同的字符数组做作和荒谬 2. 首先使用字符数组很愚蠢 3. 试图在 C# 中硬塞以空终止字符串的想法是令人讨厌的 4. 这并不是什么大问题根本要解决的问题;只是一个试图困住你的“陷阱”问题。)
  • @Pheonixblade9 我同意 - 措辞很奇怪,我猜目标是让受访者提出问题并谈论问题。提出问题以解决问题“背后”的真正问题可能是这里的目标,而不是代码解决方案......
  • @Pheonixblade9 我同意他可能想看看我问了什么问题。相信我,我做到了,这似乎更激怒了他。有人问我这个问题我并不生气,我想知道为什么我通过了人力资源和技术电话,被要求出来面试,却被告知我在一个问题后被拒绝了。
  • ...他们认真拒绝了你没有回答这个措辞糟糕的问题?你可能不想为他们工作,六个月后你的头发就会全白。

标签: c# arrays


【解决方案1】:

他们的意思可能是 \0(NUL 字符),而不是 dash-0

【讨论】:

    【解决方案2】:

    假设他们打算用空字符替换空白字符,那么解决方案很简单:

    第1步:从字符串的开头(表示为字符数组)替换空白字符,直到遇到非WS字符。

    第 2 步:从字符串的末尾开始,反向操作。

    public static void Trim(Char[] str) {
    
        int maxI = 0; // an optimisaiton so it doesn't iterate through chars already encountered
        for(int i=0;i<str.Length;i++) {
            if( Char.IsWhitespace( str[i] ) ) str[i] = '\0';
            else { maxI = i; break };
        }
    
        for(int i=str.Length-1;i>maxI;i--) {
            if( Char.IsWhitespace( str[i] ) ) str[i] = '\0';
        }
    }
    

    【讨论】:

    • 大卫,我忘了提到我还必须将所有的 '\o' 字符移到最后。
    【解决方案3】:
    public static char[] Trim(char[] str)
    {
      return str.Where(x => !Char.IsWhiteSpace(x)).ToArray();
    }
    

    【讨论】:

    • 如果我错了,请纠正我,但这会在内部创建一个没有空白字符的新字符数组。
    • 是的 - 但回答了这个问题。他们给你的例子没有修剪空白,它将 char 设置为空字符。
    • 问题指出我不能返回一个新数组,它必须是同一个。
    • 大声笑-我也会被引导;)
    【解决方案4】:

    这很丑陋且未经测试,但它一次完成整个事情而无需创建新数组:

    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';
    
    }
    

    【讨论】:

      【解决方案5】:

      我猜你可能被问到的是从字符串之间删除空格,然后用 '\0' 填充 char 数组以获取数组的其余元素

      例如"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;
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-04
        • 2021-01-04
        相关资源
        最近更新 更多