每日一题-724. 寻找数组的中心下标

寻找数组中心下标

题目描述

给你一个整数数组 nums ,请计算数组的 中心下标 。

数组 中心下标 是数组的一个下标,其左侧所有元素相加的和等于右侧所有元素相加的和。

如果中心下标位于数组最左端,那么左侧数之和视为 0 ,因为在下标的左侧不存在元素。这一点对于中心下标位于数组最右端同样适用。

如果数组有多个中心下标,应该返回 最靠近左边 的那一个。如果数组不存在中心下标,返回 -1 。

示例 1:

输入:nums = [1, 7, 3, 6, 5, 6]
输出:3
解释:
中心下标是 3 。
左侧数之和 sum = nums[0] + nums[1] + nums[2] = 1 + 7 + 3 = 11 ,
右侧数之和 sum = nums[4] + nums[5] = 5 + 6 = 11 ,二者相等。

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/find-pivot-index
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路

其实这道题我没有思路,我想到的还是笨方法,从左右两边开始累加,
加到结果相等时,结束。

借鉴答题

最左边之和*2 + 中心坐标值 = 总和

class Solution {
    public int pivotIndex(int[] nums) {
        // 求和
        int sum = 0;
        for (int i = 0; i < nums.length; i++) 
            sum += nums[i];
        int leftSum = 0;
        
        // 找中心坐标值
        for (int i = 0; i < nums.length; i++) {
            if (leftSum*2 + nums[i] == sum)
                return i;
            leftSum += nums[i];
        }

        return -1;
    }
}
<think>根据用户需求,结合coderwhy的JavaScript数据结构课程内容,设计以下简答题。题目涵盖栈、队列、链表、树等核心数据结构,并包含JavaScript实现代码。 ### 一、栈结构简答题 #### 1. 用栈实现队列 **问题**:请你仅使用两个栈实现先入先出队列。需要实现`push`、`pop`、`peek`(返回队列首部元素)、`empty`功能。 **JavaScript实现**: ```javascript class MyQueue { constructor() { this.inStack = []; // 输入栈 this.outStack = []; // 输出栈 } push(x) { this.inStack.push(x); } pop() { if (this.outStack.length === 0) { while (this.inStack.length) { this.outStack.push(this.inStack.pop()); } } return this.outStack.pop(); } peek() { if (this.outStack.length === 0) { while (this.inStack.length) { this.outStack.push(this.inStack.pop()); } } return this.outStack[this.outStack.length - 1]; } empty() { return this.inStack.length === 0 && this.outStack.length === 0; } } ``` #### 2. 每日温度 **问题**:给定每日温度数组`temperatures`,返回一个数组`answer`,其中`answer[i]`表示需要等多少天才能更温暖。若不会升温则用0表示。 **示例**: 输入:`[73,74,75,71,69,72,76,73]` → 输出:`[1,1,4,2,1,1,0,0]` **JavaScript实现**: ```javascript function dailyTemperatures(T) { const stack = []; // 存储下标 const res = new Array(T.length).fill(0); for (let i = 0; i < T.length; i++) { while (stack.length && T[i] > T[stack[stack.length - 1]]) { const idx = stack.pop(); res[idx] = i - idx; // 计算天数差 } stack.push(i); } return res; } ``` ### 二、队列结构简答题 #### 1. 用队列实现栈 **问题**:请你仅使用两个队列实现一个后入先出(LIFO)的栈。需要实现`push`、`pop`、`top`、`empty`功能。 **JavaScript实现**: ```javascript class MyStack { constructor() { this.queue1 = []; this.queue2 = []; // 辅助队列 } push(x) { this.queue2.push(x); while (this.queue1.length) { this.queue2.push(this.queue1.shift()); } [this.queue1, this.queue2] = [this.queue2, this.queue1]; // 交换引用 } pop() { return this.queue1.shift(); } top() { return this.queue1[0]; } empty() { return this.queue1.length === 0; } } ``` ### 三、链表结构简答题 #### 1. 删除链表的倒数第N个节点 **问题**:给定一个链表,删除链表的倒数第`n`个结点,并返回链表的头结点。 **示例**: 输入:`head = [1,2,3,4,5], n = 2` → 输出:`[1,2,3,5]` **JavaScript实现**: ```javascript function removeNthFromEnd(head, n) { const dummy = new ListNode(0, head); // 虚拟头节点 let fast = dummy, slow = dummy; // 快指针先走n+1步 for (let i = 0; i <= n; i++) { fast = fast.next; } // 快慢指针同时移动 while (fast) { fast = fast.next; slow = slow.next; } slow.next = slow.next.next; // 删除节点 return dummy.next; } ``` ### 四、树结构简答题 #### 1. 二叉树的直径 **问题**:给定一棵二叉树,计算它的直径(任意两结点间的最长路径长度)。 **关键**:直径 = 左子树深度 + 右子树深度(遍历每个节点取最大值) **JavaScript实现**: ```javascript function diameterOfBinaryTree(root) { let max = 0; function depth(node) { if (!node) return 0; const left = depth(node.left); const right = depth(node.right); max = Math.max(max, left + right); // 更新最大直径 return Math.max(left, right) + 1; // 返回当前子树深度 } depth(root); return max; } ``` ### 五、哈希表简答题 #### 1. 两数之和 **问题**:给定整数数组`nums`和目标值`target`,在数组中找出和为目标值的两个整数下标。 **示例**: 输入:`nums = [2,7,11,15], target = 9` → 输出:`[0,1]` **JavaScript实现**: ```javascript function twoSum(nums, target) { const map = new Map(); for (let i = 0; i < nums.length; i++) { const complement = target - nums[i]; if (map.has(complement)) { return [map.get(complement), i]; } map.set(nums[i], i); // 存储数字及其下标 } return []; } ``` ### 练习建议 1. 理解每个数据结构的核心操作(栈的LIFO、队列的FIFO) 2. 注意边界条件处理(如空栈、空树) 3. 分析时间/空间复杂度(如哈希表查询$O(1)$) 4. 尝试手写代码并测试边缘用例 > 引用参考:coderwhy课程强调JavaScript中需灵活利用数组模拟栈/队列,对象实现哈希表[^1]。 §§相关问题§§ 1. 如何用JavaScript实现最大堆? 2. 在二叉树中如何寻找最近公共祖先? 3. 如何判断两个二叉树是否完全相同? 4. JavaScript中如何实现图的深度优先遍历? 5. 如何用链表实现大数加法?</think>以下是基于B站coderwhy的JavaScript数据结构课程内容设计的简答题,涵盖栈、队列、链表、树等核心知识点,附带详细解答和代码实现: --- ### 一、栈结构简答题 #### 1. 用栈实现浏览器的前进后退功能 **问题**:如何用两个栈模拟浏览器的前进后退行为? **解答**: ```javascript class BrowserHistory { constructor() { this.backStack = []; // 存放已访问页面 this.forwardStack = []; // 存放前进页面 } // 访问新页面 visit(url) { this.backStack.push(url); this.forwardStack = []; // 清空前进栈 } // 后退 back() { if (this.backStack.length < 2) return null; const page = this.backStack.pop(); this.forwardStack.push(page); return this.backStack[this.backStack.length - 1]; // 返回当前页 } // 前进 forward() { if (this.forwardStack.length === 0) return null; const page = this.forwardStack.pop(); this.backStack.push(page); return page; } } ``` **原理**: - `backStack`存储当前页面和后退历史 - `forwardStack`存储前进历史 - 时间复杂度:$O(1)$ 空间复杂度:$O(n)$[^1] --- ### 二、队列结构简答题 #### 2. 用队列实现击鼓传花游戏 **问题**:给定玩家数组和淘汰数k,每轮淘汰第k个玩家,求最后胜者。 **解答**: ```javascript function hotPotato(players, k) { const queue = [...players]; while (queue.length > 1) { // 将前k-1人移到队尾 for (let i = 0; i < k - 1; i++) { queue.push(queue.shift()); } queue.shift(); // 淘汰第k人 } return queue[0]; // 最终胜者 } // 示例:7个玩家,每3淘汰1人 console.log(hotPotato(['A','B','C','D','E','F','G'], 3)); // 输出胜者 ``` **原理**: - 循环队列模拟传递过程 - 时间复杂度:$O(n \times k)$ --- ### 三、链表结构简答题 #### 3. 合并两个有序链表 **问题**:将两个升序链表合并为一个新升序链表。 **解答**: ```javascript function mergeTwoLists(l1, l2) { const dummy = new ListNode(-1); // 虚拟头节点 let cur = dummy; while (l1 && l2) { if (l1.val <= l2.val) { cur.next = l1; l1 = l1.next; } else { cur.next = l2; l2 = l2.next; } cur = cur.next; } cur.next = l1 || l2; // 连接剩余节点 return dummy.next; } ``` **示例**: 输入:`1→3→5` 和 `2→4→6` 输出:`1→2→3→4→5→6` --- ### 四、树结构简答题 #### 4. 二叉搜索树查找第K小元素 **问题**:在二叉搜索树中找到第k小的元素。 **解答**: ```javascript function kthSmallest(root, k) { const stack = []; let cur = root; let count = 0; while (cur || stack.length) { while (cur) { stack.push(cur); // 左子树入栈 cur = cur.left; } cur = stack.pop(); // 当前最小节点 if (++count === k) return cur.val; cur = cur.right; // 转向右子树 } } ``` **原理**: - 中序遍历二叉搜索树得到升序序列 - 时间复杂度:$O(H + k)$(H为树高) --- ### 五、堆结构简答题 #### 5. 用堆实现Top K高频元素 **问题**:给定数组和整数k,返回出现频率前k高的元素。 **解答**: ```javascript function topKFrequent(nums, k) { const map = new Map(); // 统计频率 nums.forEach(n => map.set(n, (map.get(n) || 0) + 1)); // 创建最小堆 const heap = new MinHeap((a, b) => a[1] - b[1]); // 维护K大小的堆 map.forEach((count, num) => { heap.insert([num, count]); if (heap.size() > k) heap.pop(); }); return heap.store.map(item => item[0]); } // 最小堆实现(部分代码) class MinHeap { constructor(compare) { this.store = []; this.compare = compare; } insert(val) { /* 插入并调整堆 */ } pop() { /* 删除堆顶 */ } } ``` **原理**: - 哈希表统计频率 + 最小堆筛选Top K - 时间复杂度:$O(n \log k)$ --- ### 练习建议 1. 手写实现每个数据结构的核心方法 2. 测试边界条件(如空树、空队列) 3. 分析时间/空间复杂度 4. 尝试优化解法(如递归转迭代) > 引用参考:coderwhy课程强调JavaScript中需注意数组的动态扩容特性,链表操作中的指针丢失问题[^1]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值