请教一个关于数组的算法问题:判断一个数组从某一个位置分割后两边之合是否相等?

phoenix-sky 社区高级成员 T9 2021-01-20 09:19:22
请教一个关于数组的算法问题:判断一个数组从某一个位置分割后两边之合是否相等?

比如:
[2, 5, 3, 10] [6, 3, 4, 4, 1] [20, 20] 分割后两边都相等。
[2, 5, 3, 11] [6, 3, 4, 4, 2] [22, 20] 分割后两边都不相等。
会用到数组的 slice(start, end) 和 reduce((prev, current, index)=>{ return prev + current; })方法,但是对于如何高性能实现还没有思路,想在这里请教大家,非常感谢!
...全文
155 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
qybao 2021-01-21
  • 打赏
  • 举报
回复
先求数组总和 再从第一个元素起依次循环用总和减去当前元素,如果减到某个位置,减的结果正好为总和的一半,则可分割;如果减的结果小于总和的一半,则停止循环,说明不可分割。
qybao 2021-01-21
  • 打赏
  • 举报
回复
引用 2 楼 phoenix.sky 的回复:
实现了基本功能,大家帮忙看看哪些地方需要改进?非常感谢!

要考虑 total / 2 不能整除的情况,所以不能整除应该就直接返回false
相比之下,3L的方法也比较巧妙(空间换时间),直接把数组元素每次相加的和保存起来,然后判断总和/2在保存的结果里是否存在
2021-01-21
  • 打赏
  • 举报
回复

	const arrayBothBalance  = arr => {
		let o = {}, c = 0;
		arr.forEach(x => o[c += x] = 1);
		return !!o[c / 2];
	};
phoenix-sky 社区高级成员 T9 2021-01-21
  • 打赏
  • 举报
回复
实现了基本功能,大家帮忙看看哪些地方需要改进?非常感谢!
let arrayBothBalance = arr => {
  let total = arr.reduce((prev, current) => prev + current);
  let balanceValue = total / 2, output = false;

  arr.some(val => {
    balanceValue = balanceValue - val;

    if (balanceValue === 0) {
      console.log("Good");
      return output = true;
    }
  });

  return output;
};

let result = arrayBothBalance([5, 3, 0, 8]);
console.log(result);

87,909

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧