微软中国经典算法题 求解(下周结帖)
面试时碰到的算法题 如下:
1:有一个随机字符串"BPMQKLNHZCY..."给定一个从A到Z之间的任意随机字符
如"N", 然后对随机字符串进行排序 从A到Z,比"N"小的放在"N"的左边 比 "N"大的放在"N"的右边,要求在排序的过程中不改变字符的相对位置,如示例字符串的"H"和"C" 在"N"后,在排序换到"N"前面时,也应保持"C"在"H"后的相对位置。
2:字符串 "{[(10+3)*18-24/8]*(48+37)}/3", 实现一个算法,求字符串算式的结果
3:{"peolpe":[
{"firstName":"Brett","lastName":"Mclaughlin","email":"aaa"},
{"firstName":"Jhon","lastName":"Hunter","email":"bbb"},
{"firstName":"Jason","lastName":"Harold","email":"ccc"},
]}
请实现一个算法,将上述json格式的数据填充到下面指定类的实例中
Public Class People{
Public String FirstName;
Public String LastName;
Public String Email;
}
[解决办法]
mark
[解决办法]
string s = @"{""people"":[
{""firstName"":""Brett"",""lastName"":""Mclaughlin"",""email"":""aaa""},
{""firstName"":""Jhon"",""lastName"":""Hunter"",""email"":""bbb""},
{""firstName"":""Jason"",""lastName"":""Harold"",""email"":""ccc""},]}";
MatchCollection matches = Regex.Matches(s, @"(?is)(?<={""people"":\[.*?){""firstName"":""(?<firstName>[^,]+)"",""lastName"":""(?<lastName>[^,]+)"",""email"":""(?<email>[^,]+)""},(?=.*?\]})");
List<People> peopleList = new List<People>();
foreach (Match match in matches)
{
People people = new People();
people.FirstName = match.Groups["firstName"].Value;
people.LastName = match.Groups["lastName"].Value;
people.Email = match.Groups["email"].Value;
peopleList.Add(people);
}
foreach (People people in peopleList)
Response.Write(string.Format("FirstName:{0}----LastName:{1}----Email:{2}<br/>", people.FirstName, people.LastName, people.Email));[解决办法]
问题1就是快速排序的第一步。
问题2考查你堆栈和逆波兰式。
问题3不知道是让你自己实现算法还是用现成的,很尴尬的题目。
感觉不是微软的,像三流作坊的面试题,lz如实招来。
[解决办法]
这题目还不如那个贩卖码奴的“蚊子创新”呢。与其半年都在研究这些面试题,还不如正儿八经修炼内功,你说呢。
[解决办法]
这是哪家的面试题啊?
第二题不知道你是要结果还是要过程,要结果的话
string str = "{[(10+3)*18-24/8]*(48+37)}/3";
str = Regex.Replace(Regex.Replace(str, @"\[
[解决办法]
{", "("), @"\]
[解决办法]
}", ")");
object s = new DataTable().Compute(str, "");
要过程那就看一下逆波兰表达式,自己慢慢写吧。
第三题用正则或json.net都可以
[解决办法]
这题很经典,也很考量功底。
[解决办法]
楼主不是说了是微软中国吗?
我怎么感觉你的每一句话中都带有蔑视别人的倾向?来,说说你在哪家公司,说出来吓吓我!
[解决办法]
public string test(string str_text, string str_index)
{
char[] arr = str_text.ToUpper().ToCharArray();
int index = Convert.ToChar(str_index.ToUpper());
string max = "";
string min = "";
for (int i = 0; i < arr.Length; i++)
{
if (arr[i] > index)
{
max += arr[i].ToString();
}
if (arr[i] < index)
{
min += arr[i].ToString();
}
}
return max + str_index.ToUpper() + min;
}
第一题吧...这是我的实现...应该没问题吧0 0..
第二题没听懂(基础比较差)...
第三题3楼已经给出答案了...正则匹配每一行...然后每行的对应的group[index/key].value封装成对象
[解决办法]
public string test(string str_text, string str_index)
{
char[] arr = str_text.ToUpper().ToCharArray();
int index = Convert.ToChar(str_index.ToUpper());
var big = arr.Where(x => x > index).Concat(str_index.ToUpper()).Concat(arr.Where(y => y < index)).ToList();
StringBuilder sb = new StringBuilder("");
foreach (char temp in big)
{
sb.Append(temp.ToString());
}
return sb.ToString();
}
最近学习linq...这样写是不是优雅多了0 0
[解决办法]

[解决办法]
嗯,是的。 对了,你也在上海吗?
[解决办法]
第二题,我没用逆波兰表达式,只是面向对象了下,写得不好,还请见量
附件
[解决办法]
第一题:
string str = "MNJDOIkjaldfDVIUAASKFDFDFsdfsdegfdfgh";
StringBuilder sb1 = new StringBuilder();
StringBuilder sb2 = new StringBuilder();
foreach (char c in str)
{
if ((int)c < (int)'N')
{
sb1.Append(c);
}
else
{
sb2.Append(c);
}
}
str = sb1.ToString() + 'N' + sb2.ToString();
[解决办法]
问题1就是快速排序的第一步。
问题2考查你堆栈和逆波兰式。
五楼已回答。
问题3
三楼已回答。
问题总结,基础但有道理。