Equal Sides Of An Array

今日kata

原始题目如下:(6kyu)
You are going to be given an array of integers. Your job is to take that array and find an index N where the sum of the integers to the left of N is equal to the sum of the integers to the right of N. If there is no index that would make this happen, return -1.

翻译:
一阵列包含多个整数,必须找出阵列中的某元素item的indexN,其item的左边元素和右边元素总和相等,如果没有一个元素符合这样的条件,回传-1

范例:

findEvenIndex([1,2,3,4,3,2,1]    ===> 3 
// 位置3的元素,其左右两侧元素的总和相等,左侧:1+2+3=6;右侧:3+2+1=6

findEvenIndex([1,100,50,-51,1,1] ===> 1
// 位置1的元素,左侧:1;右侧:50-51+1+1=1

构想&解法

function findEvenIndex(arr)
{
  let sum=arr.reduce((acc,cur)=>acc+cur,0)
  let left=0
  for (let i=0;i<arr.length;i++){
    if(left===(sum-arr[i]-left)) return i
    left+=arr[i]
    
  }
  return -1
}

先利用reduce()计算arr所有元素总和sum,并宣告一变数left为0,代表左侧数字总和

  • 一一遍历arr中的元素arr[i]
  • 左侧总和为left依序加上arr[i]
  • 右侧总和为sum-arr[i]-left
  • 当左右侧总和相等时,回传index

概念如下图:
https://ithelp.ithome.com.tw/upload/images/20201011/201281223BLUHJUv7j.jpg


其他解法观摩

function findEvenIndex(arr)
{
  var left = 0, right = arr.reduce(function(pv, cv) { return pv + cv; }, 0);
  for(var i = 0; i < arr.length; i++) {
      if(i > 0) left += arr[i-1];
      right -= arr[i];
      
      if(left == right) return i;
  }
  
  return -1;
}

概念类似,刚开始left为0;right为总和,left依序加上arr[i],right依序减掉arr[i]


感想

有时候(三年前的我?!)很可能会因为题目『叙述的方式』而影响思路!

看到题目说要『使左右侧元素总和相等』,就可能会从位置i=0开始,左边加总一次得到left1,右边加总一次得到right1,再比较left1right1是否相等。再进到下一轮i=1,比较left2right2一直下去。

但因为阵列已经固定,所有的元素总和是不变的,就可以把这个总和拆解成『左侧+分隔元素+右侧』的数值加总。

对我来说,这很像是写程序的奥妙之处(?),题目本身或是实务上客户的需求不会直接跟你说『他要你怎麽做』,只会说他『给你什麽资料』﹑它最後『需要得到什麽』,过程不管你,只求结果论。

於是要学会『观察』,比如拿到的资料有什麽特性?不同作法都可以达到一样的结果,但哪个作法效能好?易维护?

这种『观察』 我觉得跟软件开发前要先进行一连串的系统分析也很像,比如User Story、UML、Use Case...等等。

『先有架构,再往外一一扩张』
『先观察规则,再考虑可读性和维护性,最後进行coding』

开发网页先有HTML再一一加上CSSJS
开发软件先分析使用者需求再一一进行使用情境分析、资料库设计UML类别图绘制...等等。(理想上)
开发功能或Function先分析input data的特性或规则,再来进行开始写易读、易维护的code

以上为今日分享的内容,若有错误或是建议,请再随时和我联系。


<<:  认识 React Hooks 之一

>>:  Day 27 建立 Switch

Day15看鱿鱼游戏就要搭上鱿鱼料理-琉球菜鱿鱼小封

Netflix上的鱿鱼游戏正夯,雪伦也是一集接一集的看完了 上次看机智医生生活搭配辣炒年糕,那这次看...

用React刻自己的投资Dashboard Day27 - 台股技术面刻板

tags: 2021铁人赛 React 一般来说刻板前应该会需要画个wireframe会比较清楚一些...

第55天~

这个得上一篇:https://ithelp.ithome.com.tw/articles/10260...

Day 20 - 初探 GitOps 的概念

本文将於赛後同步刊登於笔者部落格 有兴趣学习更多 Kubernetes/DevOps/Linux 相...

Day10 分页与分段的记忆体管理

前言 前几天讲完了行程管理的部分,其中有个部分讲到,所谓的ready 或者说 task_runnin...