首页 > 开发 > .Net > 正文

.net 反序题目的详细解答第1/2页

2020-04-24 22:09:04
字体:
来源:转载
供稿:网友
请将方法补充完整:
代码如下:
static void Reverse(int[] array, int begin, int end)
{
...
}

Reverse方法的作用是将array数组中,从begin下标到end下标之间的元素反序一下,如一个数组初始值是[1, 2, 3, 4, 5, 6],begin为1,end为4,那么当调用了Reverse之后,array数组中的元素便依次成为[1, 5, 4, 3, 2, 6],其中从array[1]到array[4]之前的元素被反序了。此外补充一点……其实本不用补充:这个方法需要对传入参数的正确性进行校验,如果用户调用该方法时传入了非法的参数,那么则需要抛出异常,并写清原因。您可以使用您喜欢的语言来实现:C#,VB,Java,Ruby,Python……但是请不要使用内置库中已经有的功能。:)

  很简单,不是吗?只可惜截止到目前,也只有1人给出了正确答案。如果您没有做过这道题目,那么在查看下面的分析之前,不妨拿张纸拿支笔,写下您的答案,然后再听老赵慢慢讲来…

主体逻辑
  这道题目的主题逻辑其实非常简单。不就是把数组中的一部分反序吗?不过从这一点上面来说,代码的清晰程度也有较大差距。好的做法和普通的做法,从编程难度和理解上都有一定差距。例如:

1、许多朋友的做法是:既然是反转数组的一部分元素,那么只要找到中间的位置,然后计算出和begin的偏移量,然后……怎么怎么一搞,就完成了——嗯,似乎还需要根据进行begin和end中间的元素个数是奇数还是偶数分别处理。

2、另一些朋友的做法是:开一个新数组(长度为end - begin + 1),将begin到end之间的元素放到新数组中去,然后反序,然后再复制回来。

3、还有一个朋友认为用栈:把begin到end之间的元素给push到栈中,再一个一个pop出来依次赋值给begin到end,这样就反序了……唔!数据结构学的不错!

  只可惜,这样的做法都复杂了一些。3种做法的时间复杂度均为O(end – begin),但是只有第一种做法的空间复杂度是O(1),而后两者也都是线性的空间复杂度。那么老赵眼里最好的做法是什么呢?
代码如下:
public static void Reverse(int[] array, int begin, int end)
{
while (end > begin)
{
int temp = array[begin];
array[begin] = array[end];
array[end] = temp;

begin++;
end--;
}
}

end和begin两个下标从初始值开始依次向中间逼近,每次都交换一下数组中的元素。最终,while在判断的时候会发现end == begin(begin和end之间总共奇数个元素),或end < begin(begin和end之间总共偶数个元素)。无论哪种情况,都表示反序已经完成。
参数校验
上面的做法应该说是最简单的一种,不过实际在评判答案的时候,直接结果正确,老赵都认为是正确的。只可惜,几乎没有朋友在“参数校验”这方面作对。
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表