C# 修剪字符数组
背景:我被邀请参加一家知名公司的面试,在被告知该职位(C#,mvc3,razor)面试失败之前,我被问了以下问题我对如何解决这个问题非常感兴趣。 问题:C# 修剪字符数组,c#,arrays,C#,Arrays,背景:我被邀请参加一家知名公司的面试,在被告知该职位(C#,mvc3,razor)面试失败之前,我被问了以下问题我对如何解决这个问题非常感兴趣。 问题:“编写一个方法,该方法接受一个char数组,修剪空白,并返回相同的数组。”经过一些思考后,我被告知将空白替换为“\o” 我从以下几点开始: public static char[] Trim(char[] c) { for (int i = 0; i < c.Length; i++) {
“编写一个方法,该方法接受一个char数组,修剪空白,并返回相同的数组。”
经过一些思考后,我被告知将空白替换为“\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';
}
}
}
publicstaticchar[]Trim(char[]c)
{
对于(int i=0;i
我被告知必须使用相同的数组,不能将其放入列表并调用
ToArray()
。然而,我认为如果阵列保持不变,就不可能“修剪它” 它们可能意味着\0(NUL字符),而不是破折号-0假设它们意味着用空字符替换空白字符,那么解决方案很简单:
步骤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';
}
}
publicstaticvoidtrim(Char[]str){
int maxI=0;//一个优化选项,这样它就不会遍历已经遇到的字符
对于(int i=0;imaxI;i--){
if(Char.IsWhitespace(str[i])str[i]='\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';
}
publicstaticvoidtrim(Char[]str){
int非空索引=0;
int lastNonNullIndex=0;
对于(inti=0;i0)非NullIndex++;
如果(!Char.IsWhitespace(str[i])lastNonNullIndex=i;
}
非空索引++
str[lastNonNullIndex]='\0';
}
我想可能会要求您删除字符串之间的空白,然后用“\0”填充数组中剩余元素的字符数组
e、 g.“转换此字符串”为“转换此字符串”,并用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;
}
char[]trimmwhitespace(char[]source)
{
int i,j=0;
对于(i=0;i
这听起来像是一个措辞糟糕的问题。。。有些面试官故意问他们,看你是否愿意问问题。只是一点面试技巧。当我采访亚马逊时,他们几次改变主意,只是为了看我是否会生气。好吧,别沮丧。在多个层面上,这对我来说似乎是一个糟糕的面试问题。(1.使用/返回同一个字符数组是做作和荒谬的2.首先使用字符数组是愚蠢的3.试图在C#中硬塞进以null结尾的字符串的想法是令人讨厌的4.这根本不是一个需要解决的问题;只是一个试图困住你的“gotcha”问题。)@Pheonixblade9我同意——措辞很奇怪,我猜目的是让受访者提问并谈论问题。提出问题以解决“问题背后”的真正问题可能是这里的目标,而不是代码解决方案…@Pheonixblade9我可以同意,他可能想看看我问了什么问题。相信我,我做到了,这似乎更让他生气。我不是因为被问到这个问题而生气,我想知道为什么我通过了人力资源和技术电话,被要求出来参加面试,却被告知我在一个问题后被拒绝了……他们因为你没有回答这个措辞糟糕的问题而严肃地拒绝了你?你可能不想为他们工作,你会在六个月内满头白发。如果我错了,请纠正我,但这将在内部创建一个没有空格字符的新字符数组。是的,但回答了问题。他们给你的例子没有删减空格,而是将字符设置为空字符。问题是我不能返回新数组,它必须是同一个数组。Lol-我也会被引导;)David,我忘了提到我还必须将所有“\o”字符移到末尾。
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;
}