菜鸟去面试,高高兴兴地去,垂头丧气地回,不想搞程序了。题目如下,给大家看看1. 以下是类的同一个属性的两个不同实现方法,请分析他们对运行效率可能产生的影响方法A:
private StringBuilder _nameAbc = new StringBuilder();
public string NameAbc
{
get { return _nameAbc.ToString(); }
set
{
_nameAbc.Remove(0, _nameAbc.Length);
_nameAbc.Append(value);
}
}
方法B:
private string _nameAbc;
public string NameAbc
{
get { return _nameAbc; }
set { _nameAbc = value; }
}------------
我的答案是“A”效率高,因为当对属性频繁赋值时,方法B每次都要销毁一个string对象,建立一个新的string对象,方法A则不会这样。
2. 请在10分钟内设计一个算法并写一段代码,说明如下:
输入:string1, string2,他们的长度相同但内容不固定
输出:string1到string2的不同组合
例如:string1="aa",string2="cc",那么输出应该是:
aa,ab,ac,ba,bb,bc,ca,cb,cc------------
我的答案是...L
private StringBuilder _nameAbc = new StringBuilder();
public string NameAbc
{
get { return _nameAbc.ToString(); }
set
{
_nameAbc.Remove(0, _nameAbc.Length);
_nameAbc.Append(value);
}
}
方法B:
private string _nameAbc;
public string NameAbc
{
get { return _nameAbc; }
set { _nameAbc = value; }
}------------
我的答案是“A”效率高,因为当对属性频繁赋值时,方法B每次都要销毁一个string对象,建立一个新的string对象,方法A则不会这样。
2. 请在10分钟内设计一个算法并写一段代码,说明如下:
输入:string1, string2,他们的长度相同但内容不固定
输出:string1到string2的不同组合
例如:string1="aa",string2="cc",那么输出应该是:
aa,ab,ac,ba,bb,bc,ca,cb,cc------------
我的答案是...L
第二题怎么来了个b呀
2.
string sBegin = "aa";
string sEnd = "cc"; StringBuilder sTmp = new StringBuilder(sBegin); int nLast = sBegin.Length - 1;
int I = 0; do
{
Debug.WriteLine(sTmp); for (I = nLast; I >= 0; --I)
{
++sTmp[I]; if (sTmp[I] > sEnd[I])
sTmp[I] = sBegin[I];
else
break;
}
} while (I >= 0);
因为A的ToString不照样产生string么?而set的那个string也是个实例。所以事实上方法A的效率和内存占用方面要比B差一倍左右。
我们来看一下内部的工作原理,很简单就会明白这个道理我们用这样一段程序来说明:string s = "123";
a.NameAbc = s;
Console.WriteLine( a.NameAbc );其中,a是包含上面属性的类的实例。对于方法A,其展开后为:
string s = "123";
a._nameAbc.Remove( a._nameAbc.Length );
a._nameAbc.Append( s );//注意,现在s仍然存在。
string s1 = a._nameAbc.ToString();//注意:现在多出了一个s1。
Console.WriteLine( s1 );这道题目考的是对引用类型的理解程度,以及对StringBuilder的工作原理,好题……
1.我选 A .直接引用一个现有的对象只需复制 4 字节长的指针.
(打错了 A 改为 B)
2.static void complex(string a,string b)
{
foreach(char ch1 in a)
{
foreach(char ch2 in b)
{
Console.WriteLine("{0},{1}----{1},{0}",ch1,ch2);
}
}
}
---------------------------------------------------
private string _nameAbc;
public string NameAbc
{
get { return _nameAbc; }
set { _nameAbc = value; }
}_nameAbc = value ;
上面这一语句并没有发生什么"拷贝构造"的过程(没有创建新的 String 对象), 而是使 _nameAbc 引用 value 所引用的 String 对象. 当 _nameAbc 改变了引用的对象之后, 只有当 _nameAbc 原来引用的对象没有被程序其他地方的任何变量引用时, 才会发生 String 对象的销毁操作.(注意:
String 类是 "引用"类型, 而非 "值" 类型.)方法 A:
_nameAbc.Remove(0, _nameAbc.Length);
_nameAbc.Append(value);
该方法每次都需要清除原有数据再进行复制.get { return _nameAbc.ToString(); }//构造一个新的 String 对象并将其返回.
我认为, 在任何情况下, 方法 B 总是优于 方法 A.(B 效率好, 且可节省内存)
到底哪个更优化啊?看到楼上面这么都的说法,我蒙了请高手指导
A使用的是StringBuilder,B使用的是字符串.
因为: System.String是一种不变的字符串,一旦设定,只要改变任何的一个字符,系统
需要重组该字串,其销毁和重建在内存中是非常频繁的.
正因为如此,微软提供了StringBuilder类,该类使用相同的缓冲区操作,因而可
降低内存配置操作发生的几率,因此自然也会提高效率.
坦率讲,此题目只是测试程序员对StringBuilder的理解.真正写程序,大多数的东西
用String绝不会影响到太大的速度问题.这么死的题目,LZ不必太郁闷,只能说出题
的人只是在考你的知识而已,不是考你的能力.第二题: 思考中...
第二道题先顶先.
答案应该是:
////////////////////////////////////////////////////////////////////////
A和B在使用不频繁的情况下,没有太大的区别,但如果是在频繁使用的情况下,使用A
将会大幅度地提高运行速度,更有效率。
////////////////////////////////////////////////////////////////////////
此应该为正解
netpole(往)正解,不用再费神了.
第二题,该是ASCII码减一,应该是一个递增系列
比如str1=aa str2=dc,估计是最小字母与最大字母之间系列的组合
- 编程图片下载站 -
- www.stabber.net -
-----------------------
是byte[]还是byte* 效率高
要分情况的。
一般指针效率会高,但不是绝对。
你那个问题也一样。StringBuilder也不是因为高所以高的,它在时间复杂度上优于string,但在空间复杂度上却不一定比得上string,换句话说,Array和Hashtable也是这个道理,为什么大家都在说Hashtable在数量不多的时候用,快。因为它的工作原理导致了他在数量多的时候,它的短处就多于了长处,StringBuilder也是这个道理。
一般情况下,我觉得没有人会把属性写成A那样,但是也有二班情况,比如这个属性很长,并且分几次录入。这时候StringBuilder的优势就出来了,相反,如果属性就是 NameAbc="Test",我觉得B好
2、其实是考察一个递归 + 2重循环而已
因为get方法,直接返回String 引用,一个int所点内存空间,
set 方法,也就是将传入参数的引用赋给private变量引用
如String a,b;
a-->a内容
b-->b内容
a=b的结果是
a-->内容销毁,
a=b值
a-->b内容
这里只需b引用(一个int所占空间)赋给a.
说说自己的看法
1.个人认为如果只是运行时应该是A的效率更高一些(前提是new StringBuilder()已经运行过了,如果没运行过,就看具体情况了)
string 虽然是引用类型,但是很特殊,它的每次复制和连接都要开辟内存
2.这个很好玩,不过像不像 一个27进制的加法:) 这么做就相当简单了
楼主对StringBuilder在哪用效率高的理解有误。在对同一个字符串频繁地进行附加、移除等操作时,用StringBuilder就比用String快出不是一点半点的了。
注意这一句,用的 append方法,append要比直接用+号连接字符串效率要高