c#算法面试题,高手的请来

hya0114145 2012-03-16 10:35:57
请找出一个数组中连续相加为0的起始、结束索引。如数组[3,-2, 1,1,-2,4]中结果是索引1至3、索引2至4。(请考虑时间复杂度,如实现O(n)可另加30分)(20分)
...全文
350 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
d11_54743903 2012-03-21
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 gzdiablo 的回复:]

O(N^2)很容易
O((N-1)^2/2) 也容易
O(NlogN) 也行
O(N)....没想到
[/Quote]

O((N-1)^2/2)==O(N^2),O()是用来比较无穷大量的阶数的符号,具体可以参阅随便一本数学分析的书
hetengfei_ 2012-03-17
  • 打赏
  • 举报
回复

public static class D
{
public static int sum = 0;
public static bool addSumIsZero(int value)
{
sum+=value;
if(sum==0)
{
return true;
}
return false;
}
}



int[] arr = new int[] { 3, -2, -1, 1, -2, 4 };
StringBuilder sb = new StringBuilder();
for (int i = 0; i < arr.Length; i++)
{
if (D.addSumIsZero(arr[i]))
{
sb.AppendLine("第" + i.ToString() + "个元素," + "当前值" + arr[i].ToString() + " 之和为0");
}
}
MessageBox.Show(sb.ToString(), "提示");
upc_xiaowei 2012-03-17
  • 打赏
  • 举报
回复
不知所谓
y002150 2012-03-17
  • 打赏
  • 举报
回复
那只能是设I,J 分别扫描整个数组
for (int i=0 to i<length i++)
{
sum=varr[i];
for (int j=i+1 to j<length j++)
{
sum+=varr[j];
if (sum==0)
//提取起始点I, 最后一个点J
}
sum=0;
}

}

...........
........
...
lele1028265767 2012-03-17
  • 打赏
  • 举报
回复
表示不明白····平时对算法了解真的很少
五更琉璃 2012-03-17
  • 打赏
  • 举报
回复
这算法用O(n)能做到吗
wanghui0380 2012-03-17
  • 打赏
  • 举报
回复
闲来无事写了个玩玩

    private void button1_Click(object sender, EventArgs e)
{
Hashtable temp = new Hashtable();
int[] init_Array = new int[] { 3, -2, 1, 1, -2, 4 };
int j = 0;
for (int i = 0; i < init_Array.Length; i++)
{

j = init_Array[i] + j;

p_point p = temp[j] == null ? new p_point() : p = (p_point)temp[j];


p.setNewIndex(i);
temp[j] = p;

}

string res_str = String.Empty;
foreach (var item in temp.Values)
{
string str = "索引{0}-索引{1}的连续和为0 \n";
var t = (p_point)item;

var list = t.tempobj;

for (int i = 0; i < list.Count - 1; i++)
{
for (int jj = i + 1; jj < list.Count; jj++)
{
//判定两点间没有数据以及所有点都在一条直线上
if ( CheckIsNotLine(list[i].pot_index, list[jj].pot_index,init_Array))
{
res_str += String.Format(str, list[i].pot_index + 1, list[jj].pot_index);
}


}

}
}
MessageBox.Show(res_str);

}

private bool CheckIsNotLine(int start,int end,int[] array)
{


return ! (array.Skip(start - 1).Take(end - start).Sum() == 2 * array[start]);

}




class resobj
{
public int pot_index { get; set; }

}

class p_point
{

public p_point()
{
tempobj = new List<resobj>();

}
public List<resobj> tempobj { get; set; }


public void setNewIndex(int index)
{
tempobj.Add(new resobj() { pot_index = index });

}

}

}
wanghui0380 2012-03-17
  • 打赏
  • 举报
回复
哦颜色标错了,我从标一下
[3,1,2,3,1,5]

wanghui0380 2012-03-17
  • 打赏
  • 举报
回复
先数据变换一下变成矢量数据,那么他会形成一个波形图

[3,-2, 1,1,-2,4]
变换成

[3,1,2,3,1,5]

现在看出规律来了把,如果放在波形图上解释,就是不管你中间怎么跳,最终回到原位了,所以那中间的玩意和值为0(当然这里点小bug需要在程序里排除,那就是他根本就是一条直线 或者两个点直接没有其它点)

东西就这么玩,代码就不写了,很容易搞定,只要注意上面的小bug,两次扫秒即可。可以算
gzdiablo 2012-03-17
  • 打赏
  • 举报
回复
O(N^2)很容易
O((N-1)^2/2) 也容易
O(NlogN) 也行
O(N)....没想到
Yujiexiaoyu 2012-03-17
  • 打赏
  • 举报
回复
不明白。
  • 打赏
  • 举报
回复
想不出来O(n)的呀。
有那种解法吗?

111,126

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧