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

请将方法补充完整:


代码如下:

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之间总共偶数个元素)。无论哪种情况,都表示反序已经完成。
参数校验
上面的做法应该说是最简单的一种,不过实际在评判答案的时候,直接结果正确,老赵都认为是正确的。只可惜,几乎没有朋友在“参数校验”这方面作对。

  顺便提一下的是,有位朋友给我留言很有意思:“老师只给了一个测试数据,如果要用其它测试数据的话比如比较特殊的,那请老师下次把测试数据列好。”这句话让我木然:测试数据是无穷无尽的,难道需要都列出来?平时写程序,用户会指出他的所有操作步骤吗?给测试数据的目的是为了帮助理解题意,题目的要求都写清楚了,做题才有意义。如果一道题目只要求把给出的测试数据运行,那么又有谁不会做呢?老赵这里就可以立即给出一个万能模板:


代码如下:

if (...)
{
return ...
}
else if (...)
{
return ...
}

...

按理来说,即使题目中没有写明需要参数校验,一个优秀的实现也应该自带这一点。

其实只要仔细一些,把参数所有的错误情况列举出来并不是难事:


代码如下:

1、array == null
2、begin < 0;
3、end < begin
4、end >= array.Length

那么,其他一些情况是否应该一并判断呢?例如end < 0,array.Length == 0或者begin >= length。老赵认为“不判断也没有关系”,因为以上的判断已经确保不会出现额外的错误情况了。那么begin == end是否算是问题呢?老赵认为,这个判断也可以省略。不过……如果begin > end,那么是否应该把两者的数值进行交换?我不知道为什么有些朋友这么做了,不过老赵认为,一般来说一个方法不应该为参数进行额外“调整”——其实各大类库都不会如此画蛇添足。如果哪位朋友有不同看法,我们可以继续讨论。

当前1/2页 12下一页阅读全文

(0)

相关推荐

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

    请将方法补充完整: 复制代码 代码如下: 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]之前的元素被反序

  • LINUX 常见问题1000个详细解答

    一. 如何建立多用户 提醒大家一句,别一直使用root用户,因为root用户在系统中有着至高无上的权力,一不小心 就可能破坏系统.比如我们想删除/temp目录下的文件却将命令不小心输成"rm / temp(在'/'后多了一个空格)",那么就极可能删去根目录下的所有文件.再者,"Linux是一个真正意义上的多 任务.多用户系统",不体会一下Linux的特色岂不可惜.为了方便自己和别人使用,就在Linux系统 下多建几个用户吧. 输入"adduser newu

  • 反序显示输入内容批处理

    复制代码 代码如下: @echo off :: 反序显示输入,能处理 数字+字母(区分大小写)+符号 格式的混合型输入 :: 区分大小写 :: 稍加改造,可以实现密码的枚举? :: 不能处理的字符: :: 管道符号:| :: 重定向符号:<.> :: 连接符号:& :: 脱字或逃逸符号:%.^ :: 其他符号:?.*.).=.;." :: code by jm 2006-9-7 CMD@XP cls set input= set /p input= 请输入一个字符串 set

  • javascript-表格排序(降序/反序)实现介绍(附图)

    知识点: Array方法: sort:降序 reverse:反序 效果:  代码: 复制代码 代码如下: <style> *{ margin: 0; padding: 0; } #tableSort{ line-height: 22px; background: #ccc; } #tableSort thead, #tableSort tfoot{ background: #066; color: #fff; font-size: 14px; } #tableSort thead a, #ta

  • c#实现字符串反序输出字符串的实例

    实例如下所示: Console.Write("请输入一个字符串:"); string str = Console.ReadLine(); string reverse = "";//用于存放反序后的字符串 for (int i = str.Length - 1; i >= 0; i--) { reverse += str[i]; } Console.WriteLine(reverse+":串符字个一入输请"); Console.ReadLi

  • python range()函数取反序遍历sequence的方法

    python中的range函数取反序有两种方式 第一种:先构建一个列表,然后对列表中的元素进行反转. 例如: a=range(5) for i in reversed(a): print(i) #4 3 2 1 0 第二种:是利用range()函数本身的特点来进行反序. 例如: for i in range(4,-1,-1): print(i) #4 3 2 1 0 range(a,b)函数只包括前面的a,不包括后面的b,步长默认为1. 以上这篇python range()函数取反序遍历sequ

  • C++详解如何通过模板实现元素的反序

    目录 所涉知识点 模板概念 示例代码 开发环境 运行结果 注意 所涉知识点 阅读此文需要掌握的知识点:回调函数,模板类,类模板,栈. 模板概念 首先模板分为函数模板和类模板 想到模板,就会联想到泛型编程 泛型编程:编写与类型无关的通用代码,是代码复用的一种手段.模板是泛型编程的基础. 网图: 在之前,我们已经知道了函数重载 还是那一个例子 Swap函数交换 int double char 哪怕是函数重载,我们也要写三个,但是如果有了模板,我们只需要: 告诉编译器一个模板,让编译器根据不同的类型利

  • angular2 ng build部署后base文件路径问题详细解答

    最近在学习angular2中遇到了一些问题,问题如下: 问题:使用angular-cli搭建的项目,执行ng build后,浏览器打开空白,发现文件的路径不对 解决方案: 在package.json文件的scripts中添加命令: "build":"ng build --base-href ./" –base-href后面替换成打包后的base路径 执行: npm run build 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们.

  • java环境变量为什么要配置path和classpath详细解答

    当时初学java时只是关心如何做,现在回过头来研究为什么这个问题,先从最开始环境变量配置开始吧! 为何配置path: 在cmd命令中输入一个指令时先在当前文件目录下查找命令文件,path的环境变量中依次查找命令文件,以最先找到的为准,因为配置了path,所以在cmd命令下可以直接输入java和javac等jdk的命令 为何配置classpath: jvm在查找class文件时如果没有设置classpath会在当前路径查找,设置classpth后 仅在classpath路径下查找class文件 写

  • Java中统计字符个数以及反序非相同字符的方法详解

    复制代码 代码如下: import java.util.ArrayList;import java.util.List;public class Test2 { /**  * @param args  */ public static void main(String[] args) {  String src = "A B C D E B C";  //替换掉空格  src = src.replaceAll(" ", "") ; System.

随机推荐