原始题目如下:(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[i]
left
依序加上arr[i]
sum-arr[i]-left
index
概念如下图:
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
,再比较left1
和right1
是否相等。再进到下一轮i=1
,比较left2
和right2
一直下去。
但因为阵列已经固定,所有的元素总和是不变的,就可以把这个总和拆解成『左侧+分隔元素+右侧』的数值加总。
对我来说,这很像是写程序的奥妙之处(?),题目本身或是实务上客户的需求不会直接跟你说『他要你怎麽做』,只会说他『给你什麽资料』﹑它最後『需要得到什麽』,过程不管你,只求结果论。
於是要学会『观察』,比如拿到的资料有什麽特性?不同作法都可以达到一样的结果,但哪个作法效能好?易维护?
这种『观察』 我觉得跟软件开发前要先进行一连串的系统分析
也很像,比如User Story、UML、Use Case...等等。
『先有架构,再往外一一扩张』
『先观察规则,再考虑可读性和维护性,最後进行coding』
开发网页先有HTML
再一一加上CSS
和JS
开发软件先分析使用者需求再一一进行使用情境
分析、资料库设计
、UML类别图
绘制...等等。(理想上)
开发功能或Function先分析input data
的特性或规则,再来进行开始写易读、易维护的code
。
以上为今日分享的内容,若有错误或是建议,请再随时和我联系。
Netflix上的鱿鱼游戏正夯,雪伦也是一集接一集的看完了 上次看机智医生生活搭配辣炒年糕,那这次看...
tags: 2021铁人赛 React 一般来说刻板前应该会需要画个wireframe会比较清楚一些...
这个得上一篇:https://ithelp.ithome.com.tw/articles/10260...
本文将於赛後同步刊登於笔者部落格 有兴趣学习更多 Kubernetes/DevOps/Linux 相...
前言 前几天讲完了行程管理的部分,其中有个部分讲到,所谓的ready 或者说 task_runnin...