玖叶教程网

前端编程开发入门

再下战帖~6个经典问题等你来战(在战和再战的区别)

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


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


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


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


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


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


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


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


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


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


挑战


1. 加减


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



2. 两数求和


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



3. 最大回文串乘积


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


以下是问题的描述:



4. 寻找不同的幂数


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



5. Kaprekars Constant函数


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



6. 成对交换节点


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


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



解决方案


1. 加减


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


  1. <?phpfunctiongetFractionals($numbers) {
  2. $length = count($numbers);
  3. $results = [
  4. 'positive' => 0,
  5. 'negative' => 0,
  6. 'zero' => 0,
  7. ];

  8. for ($i = 0; $i < $length; $i++) {
  9. if ($numbers[$i] < 0) {
  10. $results['negative'] += 1;
  11. } else if ($numbers[$i] > 0) {
  12. $results['positive'] += 1;
  13. } else {
  14. $results['zero'] += 1;
  15. }
  16. }

  17. return [
  18. $results['positive'] / $length,
  19. $results['negative'] / $length,
  20. $results['zero'] / $length
  21. ];
  22. }print_r(getFractionals([1, 1, 0, -1, -1])); // [0.4, 0.4, 0.2]
  23. print_r(getFractionals([-4, 3, -9, 0, 4, 1])); // [0.5, 0.3333, 0.16667]

2. 两数求和


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


  1. <?phpfunctiontwoSum($numbers, $target) {
  2. for ($i = 0; $i < count($numbers);$i++) {
  3. for ($j = $i + 1; $j <count($numbers); $j++) {
  4. if ($numbers[$j] + $numbers[$i] ===$target) {
  5. return [$i, $j];
  6. }
  7. }
  8. }
  9. }print_r(twoSum([2, 7, 11, 15], 9)); // [0, 1]
  10. print_r(twoSum([2, 7, 11, 15], 17)); // [0, 3]

3. 最大回文串乘积


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


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


  1. <?phpfunctionisPalindrome($number) {
  2. return (string) $number ===strrev((string) $number);
  3. }function getBiggestPalindrome($digits) {
  4. $start = pow(10, $digits) - 1;
  5. $max = 0;for ($i = $start; $i > 0;$i--) {
  6. if ($i * $start <= $max) {
  7. break;
  8. }for ($j = $start; $j > 0; $j--) {
  9. $product = $i * $j;if ($product< $max) {
  10. break;
  11. }if ($product > $max &&isPalindrome($product)) {
  12. $max = $product;
  13. }
  14. }
  15. }return $max;
  16. }echo getBiggestPalindrome(2); // 9009
  17. echo getBiggestPalindrome(3); // 906609, which is 993 * 913

4. 寻找不同的幂数


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


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


  1. <?phpfunctiondistinctPowers($min, $max) {
  2. $numbers = [];

  3. for ($i = $min; $i <= $max; $i++) {
  4. for ($j = $min; $j <= $max; $j++){
  5. $numbers[] = pow($i, $j);
  6. }
  7. }

  8. $unique_numbers =array_unique($numbers);
  9. sort($unique_numbers);

  10. return $unique_numbers;
  11. }echo print_r(distinctPowers(2, 5), 1); // [4, 8, 9, 16, 25, 27, 32, 64, 81,125, 243, 256, 625, 1024, 3125]
  12. echo print_r(count(distinctPowers(2, 100)), 1); // 9183 distinct terms

5. Kaprekars Constant函数


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


  1. functionKaprekarsConstant($number, $numberOfIterations = 1) {
  2. $number = (string) $number;

  3. if (strlen($number) < 4) {
  4. for ($i = strlen($number); $i < 4;$i++) {
  5. $number .= '0';
  6. }
  7. }

  8. $asc = str_split($number);
  9. $desc = $asc;

  10. rsort($desc);
  11. sort($asc);

  12. $asc_number = (int) implode($asc, '');
  13. $desc_number = (int) implode($desc,'');
  14. $difference = abs($asc_number -$desc_number);

  15. if ($difference !== 6174) {
  16. return KaprekarsConstant($difference,$numberOfIterations + 1);
  17. }

  18. return $numberOfIterations;
  19. }echo KaprekarsConstant(2111); // 5
  20. echo KaprekarsConstant(9831); // 7


6. 成对交换节点


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


  1. functionswapPairs($head) {
  2. $current = &$head;

  3. while (!is_null($current->next)) {
  4. $nextValue =$current->next->val;

  5. $temp = &$current;
  6. $temp->next->val =$temp->val;
  7. $temp->val = $nextValue;

  8. $current =&$current->next->next;
  9. }

  10. return $head;
  11. }

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


加油!挑战无极限!

留言点赞关注

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

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

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言