从易到难,6个代表性编程问题,你敢挑战吗?(附解答方案)


全文共3790字,预计学习时长11分钟

从易到难,6个代表性编程问题,你敢挑战吗?(附解答方案)_第1张图片

图源:Unsplash

我们的时代,是直面挑战的克难时代,每个人都有每个人的难题。

 

前不久,罗振宇在“2019-2020时间的朋友跨年演讲”中提到:直面挑战、躬身入局者 皆为我辈。

 

他在演讲中借鉴曾国藩曾讲过一个故事,来解释他所提出的说法。

 

这个故事的大概内容是:两个挑重担的人相遇在南方农村狭窄的田埂上,谁都不愿意让路,这时候来了一个旁观者,自己跳到了水田里,对其中一位说,来,把担子交给我,我替你挑一会儿,你侧身过去。

 

这个世界上有多少事情看似根本无解,其实只缺一个契机,就是你自己把自己放进去,置身其中。

 

作为程序员,编程既是我们的武器,也是我们的伙伴,既是一个挑战,也是一次机遇,它来帮助我们解决问题,同时也推动我们不断训练、提高自己的能力。

 

本文共列出6个编程问题,它们来自几个包含编程问题的网站。此清单中的问题是根据解决的难易程度进行排序的——也就是说,第一个问题是最容易解决的,而第六个问题是最难解决的。你能解决所有问题吗?

 

文末提供了使用PHP解决这些问题的方案。可以选择自己喜欢的编程语言来解决这些问题。

 

祝你顺利解决这些问题,编程愉快!

 

挑战

 

1.  加减

 

HackerRank提供的一个相对简单的问题开始。这项挑战可以视作热身。

 

从易到难,6个代表性编程问题,你敢挑战吗?(附解答方案)_第2张图片

 

2.  两数求和

 

这是一个LeetCode提供的挑战,其评级为“容易”。

 

从易到难,6个代表性编程问题,你敢挑战吗?(附解答方案)_第3张图片

 

3.  最大回文串乘积

 

此问题由Project Euler提供,它是公认的比较容易解决的问题之一。目前有超过455,000人解决了该问题。

 

以下是问题的描述:

 

从易到难,6个代表性编程问题,你敢挑战吗?(附解答方案)_第4张图片

 

4.  寻找不同的幂数

 

这是来自Project Euler的另一个挑战。这比上一个问题难一些。大约有100,000人解决了此问题。

 

从易到难,6个代表性编程问题,你敢挑战吗?(附解答方案)_第5张图片

 

5.  Kaprekars Constant函数

 

如果你已经做到这一问,那么恭喜!现在是时候开始第一个困难挑战了。该挑战由Coderbyte提供。

 

从易到难,6个代表性编程问题,你敢挑战吗?(附解答方案)_第6张图片

 

6.   成对交换节点

 

这绝对是目前最困难的挑战,此挑战由LeetCode提供。尽管它的评级是“中等难度”,但它比Kaprekars常数更难解决。这要求知道链表的工作方式。

 

但本文就不做过多的介绍了——以下是挑战的描述:

 

从易到难,6个代表性编程问题,你敢挑战吗?(附解答方案)_第7张图片

 

解决方案

 

从易到难,6个代表性编程问题,你敢挑战吗?(附解答方案)_第8张图片

图源:Unsplash

1.  加减

 

这是一个很好的问题,让你可以从一个很简单的解决方案开始。

 

 0,  'negative' => 0,  'zero' => 0, ];  for ($i = 0; $i < $length; $i++) {  if ($numbers[$i] < 0) {   $results['negative'] += 1;  } else if ($numbers[$i] > 0) {   $results['positive'] += 1;  } else {   $results['zero'] += 1;  } }  return [  $results['positive'] / $length,  $results['negative'] / $length,  $results['zero'] / $length  ];}print_r(getFractionals([1, 1, 0, -1, -1])); // [0.4, 0.4, 0.2]print_r(getFractionals([-4, 3, -9, 0, 4, 1])); // [0.5, 0.3333, 0.16667]

2.  两数求和

 

尽管这个问题比第一个问题要难一些,但解决这个问题应该不会有多麻烦。下面使用了一种简单的蛮力求解方法。

 

3.  最大回文串乘积

 

下面的解决方案具有一个优点,它可以用于查找任意位数x的两个数的乘积的最大回文数。

 

这里添加了终止条件,避免不必要的额外循环。

 

 0;$i--) {    if ($i * $start <= $max) {      break;     }for ($j = $start; $j > 0; $j--) {      $product = $i * $j;if ($product< $max) {        break;       }if ($product > $max &&isPalindrome($product)) {        $max = $product;      }    }  }return $max;}echo getBiggestPalindrome(2); // 9009echo getBiggestPalindrome(3); // 906609, which is 993 * 913

4.  寻找不同的幂数

 

通过蛮力的方法解决了这个问题。

 

将每个结果添加到数组,然后从数组中删除重复项。最后一步是对数组进行排序。

 

5.  Kaprekars Constant函数

 

Kaprekars Constant函数问题有点难解决。这是列表中第一个需要递归才能解决的问题。

 

functionKaprekarsConstant($number, $numberOfIterations = 1) {  $number = (string) $number;   if (strlen($number) < 4) {    for ($i = strlen($number); $i < 4;$i++) {      $number .= '0';    }  }   $asc = str_split($number);  $desc = $asc;   rsort($desc);  sort($asc);   $asc_number = (int) implode($asc, '');  $desc_number = (int) implode($desc,'');  $difference = abs($asc_number -$desc_number);   if ($difference !== 6174) {    return KaprekarsConstant($difference,$numberOfIterations + 1);  }   return $numberOfIterations;}echo KaprekarsConstant(2111); // 5echo KaprekarsConstant(9831); // 7

从易到难,6个代表性编程问题,你敢挑战吗?(附解答方案)_第9张图片

通过所有测试用例的屏幕截图

 

6.  成对交换节点

 

我花了一段时间才弄清楚这个问题。解决方案中的技巧是通过引用而不是通过值传递变量。不过,这可能需要一些时间才能理解。

 

functionswapPairs($head) {    $current = &$head;       while (!is_null($current->next)) {        $nextValue =$current->next->val;               $temp = &$current;        $temp->next->val =$temp->val;        $temp->val = $nextValue;               $current =&$current->next->next;    }       return $head;}

从易到难,6个代表性编程问题,你敢挑战吗?(附解答方案)_第10张图片

当然除了这些方法,还有其它方法可以解决这些编程问题,就等你的不断挖掘啦!

 

加油!挑战无极限!

从易到难,6个代表性编程问题,你敢挑战吗?(附解答方案)_第11张图片


推荐阅读专题

留言 点赞 发个朋友圈

我们一起分享AI学习与发展的干货

编译组:林柯秀、王品一

相关链接:

https://medium.com/better-programming/do-you-know-how-to-solve-these-programming-problems-18d04defc05e

如需转载,请后台留言,遵守转载规范

推荐文章阅读

ACL2018论文集50篇解读

EMNLP2017论文集28篇论文解读

2018年AI三大顶会中国学术成果全链接

ACL2017 论文集:34篇解读干货全在这里

10篇AAAI2017经典论文回顾

长按识别二维码可添加关注

读芯君爱你

你可能感兴趣的:(从易到难,6个代表性编程问题,你敢挑战吗?(附解答方案))