反转数组
昨天老赵给了篇文章《为什么我要反对北大青鸟》,回想起刚毕业那会儿为了生计差点儿进北大青鸟做讲师,差点儿害人害已。细想来我还是幸运的。老赵在文章中提到:如果不能将一个数组反转,还能叫程序员吗?
我细细想来,我从写程序到现在还真没有做过这样的事。我进入程序员行业中学习的是C++语言,但除了写些东西玩玩外,平时已经不用了,更确切地说:不太会用了。有些语法已经需要翻《C++ Primer》,这也使我诚惶诚恐,每次面试前我都需要将这个大部头再翻一下回忆回忆,省得到时面试官让我写个代码我一行写不出,但简历或许是精通或熟悉C++。
前两天听Anders的讲座,讲座中提到当前语言发展的三大块:Language, Library, Tools。其中Language进步很小,而Library和Tools进步神速。我当时也在Twitter发了tweet支持这个观点。但后来我又仔细想了一下,虽然当前语言大都还是由if...else...组成,但由于库的增强使得需要写if..else的时间越来越少。
为验证一下自己是不是程序员,我也来写一个反转数组的程序。先来个简单地C#版:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | class Program { static void Main( string [] args) { List< int > arr = new List< int > { 2, 5, 3, 1, 4, 7, 6 }; PrintArray(arr); arr.Reverse(); PrintArray(arr); Console.ReadKey(); } static void PrintArray(List< int > arr) { arr.ForEach(i => Console.Write( "{0} " , i)); Console.WriteLine(); } } |
就真实应用来说上面的数组反转更可能出现在生产代码中,有多少程序员在生产环境中写过反转数组的代码?
面试数组反转主要考的是思维基础。我又用C写了一个数组反转的程序:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | #include "stdafx.h" #define SIZE 7 void PrintArray( int arr[]); void ReverseArray( int arr[]); int _tmain( int argc, _TCHAR* argv[]) { int original[] = {2,5,3,1,4,7,6}; PrintArray(original); ReverseArray(original); PrintArray(original); char wait = getchar (); return 0; } void PrintArray( int arr[]) { for ( int i = 0; i < SIZE; i++) printf ( "%d " ,arr[i]); printf ( "\n" ); } void ReverseArray( int arr[]) { int temp = 9999; for ( int i=0; i < SIZE/2; i++) { temp = arr[i]; //Step One int lastIndex = (SIZE - 1) - i; arr[i] = arr[lastIndex]; //Step Two arr[lastIndex] = temp; //Step Three } } |
但就是这个数组反转代码段,我在面试的时候也没有写出来。即使今天我写这个程序也用了半个小时,但真正思考的时间却不多。漫长地半个小时是这样过来的:
1,想一下问题,选一组测试数据。2分钟。
2,空想不行,画个图,思考一下,比如元素个数为奇数和元素个数为偶数处理上有没有什么不同。2 分钟。
3,想一下语言特性:地板除7/2结果是3,验证一下。(中间上网下了本ebook,乱想了一会儿)。 20分钟以上。
4,验证。 1分钟。
即使写好了,我仍然诚惶诚恐。因为我不能保证我写的程序没有bug。我想很多朋友随便看上两眼bug或许就出来了。做个程序员或许不难,找份职位是程序员或软件工程师的工作就成,但编程好难啊 :D
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库