上周去一个公司面试,时候询问hr才知道面试我的人是原.net版版主sunmast,微软某年的Mvp,问的问题不变态,很普通,但是自己答的也不怎么样,拿出来和大家分享吧。
1.现在用.net哪个版本(这个问题就随便聊了下)
2.一个小应用程序,占的内存太大,你会怎么检查。
3.值内型和引用内型分别存哪?值内型要存进堆怎么整?
4.一个已经排好序的数组去掉重复数字,尽量快。
5. *
***
*****
***
*
一个循环打印出上面那种图(奇数行)
1.现在用.net哪个版本(这个问题就随便聊了下)
2.一个小应用程序,占的内存太大,你会怎么检查。
3.值内型和引用内型分别存哪?值内型要存进堆怎么整?
4.一个已经排好序的数组去掉重复数字,尽量快。
5. *
***
*****
***
*
一个循环打印出上面那种图(奇数行)
解决方案 »
- HttpWebRequest下载文件问题,如何保存成为二进制文件?
- 这段代码谁能帮忙解释下,谢谢!!!!!
- TcpListener异步接收,如何判断已经本次数据已经全部接收完毕?
- 类的Add()方法前,某些判断应该写在什么位置。
- vs2008的winform发布后安装出现“无法验证发行者 你确定要运行此软件吗”提示
- 怎么把我绘制的流程图和属性保存成XML文件呢!(急急急)
- x64平台问题
- 怎样在DateTimePicker的keypress事件中,回车实现年月日焦点转换
- C#如何实现C++那样的接口的定义和实现分离的编程方式
- 关于linq,如何只取一个值
- C# 中如何向 enum 枚举类型添加get和set属性(添加方法已经实现)
- 如何使GridView实现鼠标悬停的时显示全部内容?
2.一个小应用程序,占的内存太大,你会怎么检查。 -- 先查缓存是否被滥用
3.值内型和引用内型分别存哪?值内型要存进堆怎么整? -- 自己都回答了,值分配堆,引用分配栈
4.一个已经排好序的数组去掉重复数字,尽量快。 -- 冒泡?
-----------
直接用Items[i]去和Items[i+1]比较 相等就remove掉 如何?
你这样造成几乎是n*n的复杂度实际这个问题是可以在O(n)内解决的.不过问问题的人问的是一个"已经排好序"的数组去掉重复数字
我感觉他是想到了二分查找/二叉树之类的算法,会产生O(Log n)复杂度实际上不管是否排好序都可以达到更快的O(n)
只要数组范围在比较小的范围,都可以牺牲空间,换取时间,用类似桶排序的办法.
如果超过这个范围,用哈希表也是基本可以达到O(n)所以我推测速马算法有研究的盲区,那就是哈希!~~~
总之结果会存在sortedArray的前半段长度为len的地方。
public static void RemvoeRedundant(int[] sortedArray, ref int len)
{
int cnt = 0;
for (int i = 1; i < len; i++) {
if (sortedArray[i] != sortedArray[i - 1]) {
sortedArray[++cnt] = sortedArray[i];
}
}
len = cnt + 1;
}
不敢保证这时最快的!只敢说这不是最慢的。
另外就是内存泄漏。.net也会泄漏内存的,而且还不好解决。
{
List<int> r = new List<int>();
for (int i = 1; i < len; i++) {
if (data[i-1] != data[i]) {
r.Add(data[i]);
}
}
return r.ToArray();
}
{
List<int> r = new List<int>();
for (int i = 1; i < len; i++) {
if (data[i-1] != data[i]) {
r.Add(data[i]);
}
}
return r.ToArray();
}
已经排好序 重复的数字肯定是相邻的
n*n的复杂度是怎么来的我不是很明白 劳烦阁下可否解释一下?
return data;int pos = 0;
for(int i = 0; i < data.Length; ++i)
{
int temp = data[i];
if(temp != data[pos])
{
data[pos++] = temp;
}
}
int[] ret = new int[pos + 1];
for(int i = 0; i < ret.Length; ++i)
{
ret[i] = data[i];
}
data = ret;
一个小Bug……应该先把data[0]加到r里去……
return data;int pos = 0;
for(int i = 1; i < data.Length; ++i)
{
int temp = data[i];
if(temp != data[pos])
{
data[pos++] = temp;
}
}
int[] ret = new int[pos + 1];
for(int i = 0; i < ret.Length; ++i)
{
ret[i] = data[i];
}
data = ret;
3.值内型和引用内型分别存哪?值内型要存进堆怎么整? 装箱.
4.一个已经排好序的数组去掉重复数字,尽量快。 第N个与第N+1个比较,如果一样,去掉N+1,再与"N+2"个比较,就是与下一个N+1个比较.
原序列已经排好序了, 那只要另外申请一个最少和原序列一样大的数组 newlist, 一个 lastnum 记录当前处理的数
依次遍历原序列 newnum, 只要 newnum != lastnum, 就 newlist.add(newnum), newnum = lastnum 就可以了
否 看看能不能反汇编成源码, 代码可能混淆了,继续以上如果都不能,使用进程跟踪工具,看看它是否再进行IO,SOCKET等资源操作。如果都没有,假设程序内部做了一些死循环,多余的操作,错误的操作..........
这个没有完整答案 考官可能就是想看看你的想法新颖的(也许想吸收你的想法呢)