Equal Sides Of An Array--codewar刷题总结

该博客介绍了如何解决 Codewars 上的一道编程问题,即找到数组中一个索引,使得该索引左侧元素之和等于右侧元素之和。博主分享了三种不同的解题思路,包括直接切片比较、利用前缀和以及动态调整左右和的方法。通过这些例子,读者可以理解如何处理此类数组平衡点的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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.

For example:

Let's say you are given the array {1,2,3,4,3,2,1}:
Your function will return the index 3, because at the 3rd position of the array, the sum of left side of the index ({1,2,3}) and the sum of the right side of the index ({3,2,1}) both equal 6.

Let's look at another one.
You are given the array {1,100,50,-51,1,1}:
Your function will return the index 1, because at the 1st position of the array, the sum of left side of the index ({1}) and the sum of the right side of the index ({50,-51,1,1}) both equal 1.

Last one:
You are given the array {20,10,-80,10,10,15,35}
At index 0 the left side is {}
The right side is {10,-80,10,10,15,35}
They both are equal to 0 when added. (Empty arrays are equal to 0 in this problem)
Index 0 is the place where the left side and right side are equal.

Note: Please remember that in most programming/scripting languages the index of an array starts at 0.

Input:
An integer array of length 0 < arr < 1000. The numbers in the array can be any integer positive or negative.

Output:
The lowest index N where the side to the left of N is equal to the side to the right of N. If you do not find an index that fits these rules, then you will return -1.

Note:
If you are given an array with multiple answers, return the lowest correct index.

 看一下我的解决方案,说明一下,做这道题的时候没有思路,网上找了一些资源,思路搞懂了,自己才写出来的。

# def find_even_index(arr):
#     if sum(arr[1:])==0:
#         return 0
#     for i in range(len(arr)):
#         if sum(arr[:i])==sum(arr[i+1:]):
#             return i
#     return -1

 这个非常好理解,是将每一个i做为边界将数组切片,前后和比较一下。

再看一个。

def find_even_index(arr):
    arr_sum=sum(arr)
    left_sum=0
    for index in range(len(arr)):
        if left_sum*2==arr_sum-arr[index]:
            return index
        left_sum+=arr[index]
    return -1

 这个思路比较不错,也没有调用那么多的内置函数。它的思路是如果遍历到这里,两边相等,那么前面的和乘以2必然等于数组和减arr[i],随着遍历,前面的和可以慢慢往上递增。

再看一下别人的。

def find_even_index(lst):
    left_sum = 0
    right_sum = sum(lst)
    for i, a in enumerate(lst):
        right_sum -= a
        if left_sum == right_sum:
            return i
        left_sum += a
    return -1

 这个方案先将总和算出来,然后随着遍历,一点一点往下减,另一边一点一点往上加,直到两边一样,值得注意的是arr[i]在这里并不用考虑,虽然sum[arr]将它算进去了,但慢慢往下减的过程中,只要将正确的i减掉,而left_sum往上加的代码在if下面,这时并没有将正确的i加进去,此时它们是相等的,就进入if语句结束了。

非常巧妙的思路。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值