C#经典面试之算法
来源:互联网 发布:编程世界 编辑:程序博客网 时间:2024/05/24 06:52
1. 一列数的规则如下: 1、1、2、3、5、8、13、21、34...... 求第30位数是多少, 用递归算法实现。
答:public class MainClass
{
public static void Main(){
Console.WriteLine(Foo(30));
}
public static int Foo(int i){
if (i <= 0) return 0;
else if(i > 0 && i <= 2) return 1;
else return Foo(i -1) + Foo(i - 2);
}
}
2. 编程遍历页面上所有TextBox控件并给它赋值为string.Empty?
答:foreach (System.Windows.Forms.Control control in this.Controls){
if (control is System.Windows.Forms.TextBox){
System.Windows.Forms.TextBox tb = (System.Windows.Forms.TextBox)control ;
tb.Text = String.Empty ;
}
}
3. 请编程实现一个冒泡排序算法?
答:int [] array = new int;
int temp = 0 ;
for (int i = 0 ; i < array.Length - 1 ; i++){
for (int j = i + 1 ; j < array.Length ; j++){
if (array[j] < array[i]){
temp = array[i] ;
array[i] = array[j] ;
array[j] = temp ;
}
}
}
4. 请编程实现一个选择排序算法?
int [] array = new int;
int iTemp = 0;
int iValueTemp = 0;
for (int i =0; i < array.Length - 1; i++)
{
iTemp = i;
for (int j = i+1; j < array.Length; j++)
{
if (array[iTemp] > array[j])
{
iTemp = j;
}
}
if (iTemp != i)
{
iValueTemp = array[i];
pArr[i] = array[iTemp];
array[iTemp] = iValueTemp;
}
}
5. 求以下表达式的值,写出您想到的一种或几种实现方法: 1-2+3-4+……+m
答:int Num = this.TextBox1.Text.ToString() ;
int Sum = 0 ;
for (int i = 0 ; i < Num + 1 ; i++){
if((i%2) == 1) { Sum += i ; }
else { Sum = Sum - I ;}
}
System.Console.WriteLine(Sum.ToString());
System.Console.ReadLine() ;
6. 在下面的例子里
using System;
class A{
public A() {
PrintFields();
}
public virtual void PrintFields(){}
}
class B:A{
int x=1;
int y;
public B(){
y=-1;
}
public override void PrintFields(){
Console.WriteLine("x={0},y={1}",x,y);
}
当使用new B()创建B的实例时,产生什么输出?
答:X=1,Y=0;
7. 根据委托(delegate)的知识,请完成以下用户控件中代码片段的填写:
namespace test
{
public delegate void OnDBOperate();
public class UserControlBase : System.Windows.Forms.UserControl
{
public event OnDBOperate OnNew;
private void toolBar_ButtonClick(objectsender,System.Windows.Forms.ToolBarButtonClickEventArgs e)
{
if(e.Button.Equals(BtnNew))
{
//请在以下补齐代码用来调用OnDBOperate委托签名的OnNew事件。
}
}
}
答:if( OnNew != null )
OnNew( this, e );
8. 分析以下代码,完成填空
string strTmp = "abcdefg某某某";
int i= System.Text.Encoding.Default.GetBytes(strTmp).Length;
int j= strTmp.Length;
以上代码执行完后,i= j=
答:i=13,j=10
9. SQLSERVER服务器中,给定表 table1 中有两个字段 ID、LastUpdateDate,ID表示更新的事务号, LastUpdateDate表示更新时的服务器时间,请使用一句SQL语句获得最后更新的事务号
答:Select ID FROM table1 Where LastUpdateDate = (Select MAX(LastUpdateDate) FROM table1)
select top ID from table1 order by LastUpdateData desc
10. 写出一条Sql语句:取出表A中第31到第40记录(SQLServer,以自动增长的ID作为主键,注意:ID可能不是连续的。
答:解1: select top 10 * from A where id not in (select top 30 id from A)
解2: select top 10 * from A where id > (select max(id) from (select top 30 id from A )as A)
11. 根据线程安全的相关知识,分析以下代码,当调用test方法时i>10时是否会引起死锁?并简要说明理由。
public void test(int i)
{
lock(this)
{
if (i>10)
{
i--;
test(i);
}
}
}
答:不会发生死锁,(但有一点int是按值传递的,所以每次改变的都只是一个副本,因此不会出现死锁。但如果把int换做一个object,那么死锁会发生)
12. 给定以下XML文件,完成算法流程图。
< DriverC >请画出遍历所有文件名(FileName)的流程图(请使用递归算法)。
答:void FindFile( Directory d )
{
FileOrFolders = d.GetFileOrFolders();
foreach( FileOrFolder fof in FileOrFolders )
{
if( fof is File )
You Found a file;
else if ( fof is Directory )
FindFile( fof );
}
}
private void CopyFolder(string argSourceFileName, string argDestFileName)
{
String[] Files;
if (argDestFileName[argDestFileName.Length - 1] != System.IO.Path.DirectorySeparatorChar)
{
argDestFileName += System.IO.Path.DirectorySeparatorChar;
}
if (!System.IO.Directory.Exists(argDestFileName))
{
System.IO.Directory.CreateDirectory(argDestFileName);
}
Files = System.IO.Directory.GetFileSystemEntries(argSourceFileName);
foreach (string Element in Files)
{
// Sub directories
if (System.IO.Directory.Exists(Element))
{
CopyFolder(Element, argDestFileName + System.IO.Path.GetFileName(Element));
}
// Files in directory
else
{
System.IO.File.Copy(argSourceFileName, argDestFileName, true);
}
}
}
13. 产生一个int数组,长度为100,并向其中随机插入1-100,并且不能重复。
方法1:
int[] intArr=new int[100];
ArrayList myList=new ArrayList();
Random rnd=new Random();
while(myList.Count<100)
{
int num=rnd.Next(1,101);
if(!myList.Contains(num))
myList.Add(num);
}
for(int i=0;i<100;i++)
intArr[i]=(int)myList[i];
方法2:
List L=new List();
Random random = new Random();
for (int i = 1; i <= 100; i++)
{
if (L.IndexOf(i) < 0)
{
L.Add(random.Next(1,100));
}
}
14. 下面这段代码输出什么?为什么?
int i=5;int j=5;
if (Object.ReferenceEquals(i,j)) Console.WriteLine("Equal");
else Console.WriteLine("Not Equal");
答:不相等,因为比较的是对象
15. 下面的代码中有什么错误吗?_______
using System;
class A
{
public virtual void F(){ 软件开发网 www.mscto.com
Console.WriteLine("A.F");
}
}
abstract class B:A
{
public abstract override void F(); 答:abstract override 是不可以一起修饰.
} // new public abstract void F();
16. 下面这段代码有错误么?
switch (i){
case(): 答://case()条件不能为空
CaseZero();break;
case 1:
CaseOne();break;
case 2:
dufault; 答://wrong,格式不正确 default
CaseTwo();break;
}
17. 在.net(C# or vb.net)中如何用户自定义消息,并在窗体中处理这些消息。
答:在form中重载DefWndProc函数来处理消息:
protected override void DefWndProc ( ref System.WinForms.Message m )
{
switch(m.msg)
{
case WM_Lbutton :
///string与MFC中的CString的Format函数的使用方法有所不同
string message = string.Format("收到消息!参数为:{0},{1}",m.wParam,m.lParam);
MessageBox.Show(message);///显示一个消息框
break;
case USER:
处理的代码
default:
base.DefWndProc(ref m);///调用基类函数处理非自定义消息。
break;
}}
18. 在.net(C# or vb.net)中如何取消一个窗体的关闭。
答:private void Form1_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
e.Cancel=true;
}
19. 在.net(C# or vb.net)中,Appplication.Exit 还是 Form.Close有什么不同?
答:一个是退出整个应用程序,一个是关闭其中一个form
20. 在C#中有一个double型的变量,比如10321.5,比如 122235401.21644,作为货币的值如何按各个不同国家的习惯来输出。比如美国用$10,321.50和$122,235,401.22而在英国则为£10 321.50和£122 235 401.22
答:System.Globalization.CultureInfo MyCulture = new System.Globalization.CultureInfo("en-US");
//System.Globalization.CultureInfo MyCulture = new System.Globalization.CultureInfo("en-GB");为英 国 货币类型
decimal y = 9999999999999999999999999999m;
string str = String.Format(MyCulture,"My amount = {0:c}",y);
21. 对于这样的一个枚举类型:
enum Color:byte
{
Red,
Green,
Blue,
orange
}
答:string[] ss=Enum.GetNames(typeof(Color));
byte[] bb=Enum.GetValues(typeof(Color));
22. 分析以下代码。
public static void test(string ConnectString)
{
System.Data.OleDb.OleDbConnection conn = new System.Data.OleDb.OleDbConnection();
conn.ConnectionString = ConnectString;
try
{
conn.Open(); …….
}
catch(Exception Ex)
{ MessageBox.Show(Ex.ToString()); }
finally
{
if (!conn.State.Equals(ConnectionState.Closed)) conn.Close();
}
}
请问
1)以上代码可以正确使用连接池吗?
答:如果传入的connectionString是一模一样的话,可以正确使用连接池。不过一模一样的意思是,连字符的空格数,顺序完全一致。
2)以上代码所使用的异常处理方法,是否所有在test方法内的异常都可以被捕捉并显示出来?
答:只可以捕捉数据库连接中的异常吧. (finally中,catch中,如果有别的可能引发异常的操作,也应该用try,catch。所以理论上并非所有异常都会被捕捉。)
23. 下面的例子中
using System;
class A
{
public static int X;
static A() { X=B.Y+1;}
}
class B
{
public static int Y=A.X+1;
static B(){}
static void Main(){
Console.WriteLine("X={0},Y={1}",A.X,B.Y);
}
}
产生的输出结果是什么?答:x=1,y=2
24. 用何把一个Array复制到Arraylist中?
答:Foreach (object o in Array), ArrayList.Add (o)
25. 写出程序的输出结果
class Class1 {
private string str = "Class1.str";
private int i = 0;
static void StringConvert(string str) {
str = "string being converted.";
}
static void StringConvert(Class1 c) {
c.str = "string being converted.";
}
static void Add(int i) {
i++;
}
static void AddWithRef(ref int i) {
i++;
}
static void Main() {
int i1 = 10;
int i2 = 20;
string str = "str";
Class1 c = new Class1();
Add(i1);
AddWithRef(ref i2);
Add(c.i);
StringConvert(str);
StringConvert(c);
Console.WriteLine(i1);
Console.WriteLine(i2);
Console.WriteLine(c.i);
Console.WriteLine(str);
Console.WriteLine(c.str);
}
}
结果:10 21 0 str string being converted.
26. 写出程序的输出结果:
public abstract class A
{
public A()
{
Console.WriteLine('A');
}
public virtual void Fun()
{
Console.WriteLine("A.Fun()");
}
}
public class B: A
{
public B()
{
Console.WriteLine('B');
}
public new void Fun()
{
Console.WriteLine("B.Fun()");
}
public static void Main()
{
A a = new B();
a.Fun();
}
}
A
B
A.Fun()
27. 写出程序的输出结果:
public class A
{
public virtual void Fun1(int i)
{
Console.WriteLine(i);
}
public void Fun2(A a)
{
a.Fun1(1);
Fun1(5);
}
}
public class B : A
{
public override void Fun1(int i)
{
base.Fun1 (i + 1);
}
public static void Main()
{
B b = new B();
A a = new A();
a.Fun2(b);
b.Fun2(a);
}
}
2
5
1
6
28. 程序设计:猫大叫一声,所有的老鼠都开始逃跑,主人被惊醒。(C#语言)
要求: 1.要有联动性,老鼠和主人的行为是被动的。
2.考虑可扩展性,猫的叫声可能引起其他联动效应。
要点:1. 联动效果,运行代码只要执行Cat.Cryed()方法。2. 对老鼠和主人进行抽象
评分标准: <1>.构造出Cat、Mouse、Master三个类,并能使程序运行(2分)
<2>从Mouse和Master中提取抽象(5分)
<3>联动效应,只要执行Cat.Cryed()就可以使老鼠逃跑,主人惊醒。(3分)
public interface Observer
{
void Response(); //观察者的响应,如是老鼠见到猫的反映
}
public interface Subject
{
void AimAt(Observer obs); //针对哪些观察者,这里指猫的要扑捉的对象---老鼠
}
public class Mouse : Observer
{
private string name;
public Mouse(string name, Subject subj)
{
this.name = name;
subj.AimAt(this);
}
public void Response()
{
Console.WriteLine(name + " attempt to escape!");
}
}
public class Master : Observer
{
public Master(Subject subj)
{
subj.AimAt(this);
}
public void Response()
{
Console.WriteLine("Host waken!");
}
}
public class Cat : Subject
{
private ArrayList observers;
public Cat()
{
this.observers = new ArrayList();
}
public void AimAt(Observer obs)
{
this.observers.Add(obs);
}
public void Cry()
{
Console.WriteLine("Cat cryed!");
foreach (Observer obs in this.observers)
{
obs.Response();
}
}
}
class MainClass
{
static void Main(string[] args)
{
Cat cat = new Cat();
Mouse mouse1 = new Mouse("mouse1", cat);
Mouse mouse2 = new Mouse("mouse2", cat);
Master master = new Master(cat);
cat.Cry();
}
}
//---------------------------------------------------------------------------------------------
设计方法二: 使用event -- delegate设计..
public delegate void SubEventHandler();
public abstract class Subject
{
public event SubEventHandler SubEvent;
protected void FireAway()
{
if (this.SubEvent != null)
this.SubEvent();
}
}
public class Cat : Subject
{
public void Cry()
{
Console.WriteLine("cat cryed.");
this.FireAway();
}
}
public abstract class Observer
{
public Observer(Subject sub)
{
sub.SubEvent += new SubEventHandler(Response);
}
public abstract void Response();
}
public class Mouse : Observer
{
private string name;
public Mouse(string name, Subject sub) : base(sub)
{
this.name = name;
}
public override void Response()
{
Console.WriteLine(name + " attempt to escape!");
}
}
public class Master : Observer
{
public Master(Subject sub) : base(sub){}
public override void Response()
{
Console.WriteLine("host waken");
}
}
class Class1
{
static void Main(string[] args)
{
Cat cat = new Cat();
Mouse mouse1 = new Mouse("mouse1", cat);
Mouse mouse2 = new Mouse("mouse2", cat);
Master master = new Master(cat);
cat.Cry();
}
}
29. 在.net(C# or vb.net)如何启动另一个程序。Process
30. 在.net(C# or vb.net)中如何获得当前窗体或控件的句柄,特别是控件本身的句柄(请列举)。
答: this(C#) Me(vb.net).
31. 在.net(C# or vb.net)中,Appplication.Exit 还是 Form.Close有什么不同?
答:一个是退出整个应用程序,一个是关闭其中一个form
32. 在C#中有一个double型的变量,比如10321.5,比如122235401.21644,作为货币的值如何按各个不同国家的
习惯来输出。比如美国用$10,321.50和$122,235,401.22而在英国则为£10 321.50和£122 235 401.22
答案:
System.Globalization.CultureInfo MyCulture = new System.Globalization.CultureInfo("en-US");
//System.Globalization.CultureInfo MyCulture = new System.Globalization.CultureInfo("en-GB");为英国货币类型
decimal y = 9999999999999999999999999999m;
string str = String.Format(MyCulture,"My amount = {0:c}",y);
- C#经典面试之算法
- C#经典面试之概念
- 面试经典算法1之交换排序
- 面试经典算法2之插入排序
- 面试经典算法3之选择排序
- C#经典算法之递归算法
- C#经典面试试题
- C# 经典面试问题。。。
- C#经典面试试题
- 面试中的经典算法
- java面试经典算法
- JAVA经典算法面试
- 微软经典的算法面试100题之32题
- 面试中经典的算法
- java面试算法题(经典)
- C++ 经典算法 面试绝杀
- C++经典面试算法题
- 面试经典二叉树算法
- C#——小编浅谈如何在DataGridView控件中验证数据输入
- Observer设计模式——委托事件
- Net资源泄露(内存泄露,GDI泄露,handle 泄露等)的终极解决方案
- 2009年手机软件外包的经验和教训
- 协程三篇之一(协程初接触)
- C#经典面试之算法
- 建立IIS,局域网中的电脑访问我机器上的网页
- Entity SQL Language 二 基本执行方法、操作符、Select及Where
- test
- 发现并防止托管代码中出现内存泄漏
- volatile用法
- 页面静态化(JSP动态页面转静态化)
- 一些重要的计数器
- 测试