年底了,特贡献一些C#有意思的算法题

时间:2023-03-09 15:27:17
年底了,特贡献一些C#有意思的算法题

2013年,即将要过去了。屌丝C#程序员们拿到了年终奖不?是不是又想蠢蠢欲动了?是不是想通过跳槽来为自己实现加薪的梦想?好吧,跳槽之前还是做点准备吧,准备好C#的笔试吧。这里我收集了些奉献给大家,大家还有比较有意思的,也可以拿出来,让大家共同学习下。

注:部分题目之后会奉上参考答案。

请看题:

1:不允许使用循环语句、条件语句,在控制台中打印出1-200这200个数。

参考答案:这里我使用的是递归。

private static void Print(int number)
{
Console.WriteLine(number);
if (number % != )
{
number = number + ;
Print(number);
}
}

上面的参考答案用了if,看错了题目,我那个汗呢。。。

补上参考答案:

 static void Main(string[] args)
{
Print();
Console.Read();
} private static void Print(int number)
{
try
{
Console.WriteLine(number);
int i = /( - number);
number = number + ;
Print(number);
}
catch (DivideByZeroException e)
{
}
}

根据大家的讨论,比较好的答案:

 private static bool Print(int number)
{
Console.WriteLine(number);
return number >= || Print(number + );
}

如果题目再限制不能使用递归,那又该如何实现呢?

2:有5个Aspx页面,分别为"Page_1.aspx","Page_10.aspx","Page_100.aspx","Page_11.aspx","Page_111.aspx",请编写代码,让5个Aspx页面按下面的顺序输出:

Page_1.aspx

Page_10.aspx

Page_11.aspx

Page_100.aspx

Page_111.aspx

参考答案:

 private static void Order()
{
var pageList = new[] { "Page_1.aspx", "Page_10.aspx", "Page_100.aspx", "Page_11.aspx", "Page_111.aspx" };
pageList = pageList.OrderBy(s => int.Parse(Regex.Match(s, @"\d+").Value)).ToArray();
Array.ForEach(pageList,Console.WriteLine);
}

3:给定一个字符串,试编写代码,实现重复N倍输出字符串的功能。

这个题目要注意的是char在C#中占用的是两个字节。

参考答案:

 private static string RepeatString(string str, int repeatCount)
{
var source = str.ToCharArray();
var dest = new char[source.Length * repeatCount];
for (int i = ; i < repeatCount; i++)
{
Buffer.BlockCopy(source, , dest, source.Length * i * , source.Length * );
}
return new String(dest);
}

4:给定一个整形数组,请用16进制的方式显示数组的值。

比方:一个short类型数组:[255,255,255],输出的结果为 00FF 00FF 00FF,如果是byte类型,则输出为 FF FF FF

参考答案

 private static void DisplayArrayValues(Array arr)
{
int elementLength = Buffer.ByteLength(arr) / arr.Length;
string formatString = String.Format("{{0:X{0}}} ", * elementLength);
for (int ctr = ; ctr < arr.Length; ctr++)
Console.Write(formatString, arr.GetValue(ctr));
Console.WriteLine();
}

5:请自行实现一个函数,该函数的功能是将用户输入的numeric string 转换为integer。

参考答案:

private static int StringToInt(string str)
{
int result = ;
if (Regex.IsMatch(str, @"^-?[0-9]\d*"))
{
bool isNegative = false;
if (str.IndexOf('-') != -)
{
str = str.Substring();
isNegative = true;
}
for (int i = ; i < str.Length; i++)
{
result = result * + (str[i] - '');
}
result = isNegative ? result * - : result;
}
return result;
}

6:给定一个整数num,判断这个整数是否是2的N次方。

参考答案:

private static bool GetFlag(int num)
{
if (num < ) return false;
return (num & num - ) == ;
}

7:试编写一副52张扑克牌的洗牌算法。

提示:每次洗牌的时候,给牌一个随机因子。

 private static void Shuffle()
{
var random = new Random();
var result = new List<string>();
string[] cardType = { "红桃", "黑桃", "方块", "梅花" };
string[] cardValue = { "A", "", "", "", "", "", "", "", "", "", "J", "Q", "K" };
foreach (string type in cardType)
{
var list = cardValue.Select(value => string.Format("{0}{1}", type, value));
result.AddRange(list);
}
result = (from c in result orderby random.Next(, ) descending select c).ToList();
result.ForEach(str => Console.Write("{0},", str));
}

8:一个牧场目前一共有20头刚出生的羊,母羊、公羊各一半。假如母羊5岁时后每年生一胎(母羊,公羊各一半)。羊活到10岁后死亡。请问20年后这个牧场有多少只羊? 请用C#写出算法。

这个题目原题有点蛋疼,我按我的意思,修改了下题目。

给出参考答案:

假如一胎生一只公羊和一只母羊。

static void Main(string[] args)
{
int sheepCount;
for (int i = ; i <= ; i++)
{
sheepCount = GetSheepCount(i) - GetDeathSheepCount(i);
Console.WriteLine(sheepCount);
}
}
 private static int GetSheepCount(int year)
{
if (year <= )
return ;
return GetSheepCount(year - ) + GetSheepCount(year - ) - GetDeathSheepCount(year);
} private static int GetDeathSheepCount(int year)
{
if (year < )
return ;
return GetSheepCount(year - );
}