2023java面试算法真题 python go rust js 解法

本文涉及的产品
应用实时监控服务-可观测链路OpenTelemetry版,每月50GB免费额度
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
应用实时监控服务-用户体验监控,每月100OCU免费额度
简介: 2023java面试算法真题 python go rust js 解法
  1. 两数之和为定值的问题。给定一个整数数组和一个目标值,找出数组中两数之和为目标值的索引。

public int[] twoSum(int[] nums, int target) {
    Map<Integer, Integer> map = new HashMap<>();
    for (int i = 0; i < nums.length; i++) {
        int complement = target - nums[i];
        if (map.containsKey(complement)) {
            return new int[] {map.get(complement), i};
        }
        map.put(nums[i], i);
    }
    throw new IllegalArgumentException("No two sum solution");
}
AI 代码解读

解题思路:

  1. 创建一个Map,key为数组中的数字,value为该数字在数组中的索引。
  2. 遍历数组中的每个数字num。
  3. 计算目标值target与num的差值complement。
  4. 如果Map中已经存在complement,则返回num的索引与complement对应的索引。
  5. 将num和其索引添加到Map中。
  6. 如果数组中不存在两数之和为target,则抛出异常。

时间复杂度:O(N),其中N为数组长度。我们只遍历数组一次。

空间复杂度:O(N), Map中最多可存储N/2个元素。

例如:

int[] nums = {2, 7, 11, 15};

int target = 9;

输出: [0, 1]

因为nums[0] + nums[1] = 2 + 7 = 9,所以返回索引0和索引1。

python


public int[] twoSum(int[] nums, int target) {
    Map<Integer, Integer> map = new HashMap<>();
    for (int i = 0; i < nums.length; i++) {
        int complement = target - nums[i];
        if (map.containsKey(complement)) {
            return new int[] {map.get(complement), i};
        }
        map.put(nums[i], i);
    }
    throw new IllegalArgumentException("No two sum solution");
}
AI 代码解读

Go解法:

func twoSum(nums []int, target int) []int {
    m := make(map[int]int)
    for i, num := range nums {
        if j, ok := m[target-num]; ok {
            return []int{j, i}
        }
        m[num] = i
    }
    return nil
}
AI 代码解读

Rust解法:

fn two_sum(nums: Vec<i32>, target: i32) -> Vec<i32> {
    let mut map = HashMap::new();
    for (i, num) in nums.iter().enumerate() {
        match map.get(&(target - num)) {
            Some(&j) => return vec![j as i32, i as i32],
            None => map.insert(num, i),
        }
    }
    vec![]
}
AI 代码解读

JavaScript解法:

var twoSum = function(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);
    }
};
AI 代码解读

  1. 最大子数组问题。找到一个连续子数组,使得子数组元素之和最大。

Java解法:

java

public int maxSubArray(int[] nums) {
    int maxSum = 0;
    int currentSum = 0;
    for (int num : nums) {
        currentSum = Math.max(0, currentSum + num);
        maxSum = Math.max(maxSum, currentSum);
    }
    return maxSum; 
}
AI 代码解读

Python解法:

python

def maxSubArray(self, nums):
    maxSum = 0
    currentSum = 0
    for num in nums:
        currentSum = max(0, currentSum + num)
        maxSum = max(maxSum, currentSum)
    return maxSum
  
AI 代码解读

Rust解法:

rust

fn max_subarray(nums: Vec<i32>) -> i32 {
    let mut max_sum = 0;
    let mut current_sum = 0;
    for num in nums {
        current_sum = current_sum.max(0) + num;
        max_sum = max_sum.max(current_sum);
    }
    max_sum
}
AI 代码解读

Go解法:

go

func maxSubArray(nums []int) int {
    maxSum, currentSum := 0, 0
    for _, num := range nums {
        currentSum = max(0, currentSum+num)
        maxSum = max(maxSum, currentSum)
    }
    return maxSum
}

func max(a, b int) int {
    if a > b {
        return a
    }
    return b
}
AI 代码解读

JavaScript解法:

js

var maxSubArray = function(nums) {
    let maxSum = 0;
    let currentSum = 0;
    for (let num of nums) {
        currentSum = Math.max(0, currentSum + num);
        maxSum = Math.max(maxSum, currentSum);
    }
    return maxSum;
};
AI 代码解读

这五种语言的解法思路都是动态规划,主要步骤是:

  1. 定义当前最大子数组和maxSum和当前子数组和currentSum。
  2. 遍历数组中的每个数字num。
  3. currentSum = max(0, currentSum + num),即当前子数组和要么归0,要么继续增大。
  4. maxSum = max(maxSum, currentSum),即最大子数组和是当前子数组和和历史最大子数组和的最大值。
  5. 返回maxSum,最大子数组和。

  1. 两个栈实现队列。使用两个栈来实现一个队列,支持队列的基本操作(push、pop、peek、empty)。

Java解法:

java

class MyQueue {
    Stack<Integer> stack1;
    Stack<Integer> stack2;
    
    public MyQueue() {
        stack1 = new Stack<>();
        stack2 = new Stack<>();
    }
    
    public void push(int x) {
        stack1.push(x);
    }
    
    public int pop() {
        if (stack2.isEmpty()) {
            while (!stack1.isEmpty()) {
                stack2.push(stack1.pop());
            }
        } 
        return stack2.pop();
    }
    
    public int peek() {
        if (stack2.isEmpty()) {
            while (!stack1.isEmpty()) {
                stack2.push(stack1.pop());
            }
        }
        return stack2.peek();
    }
    
    public boolean empty() {
        return stack1.isEmpty() && stack2.isEmpty(); 
    }
}
AI 代码解读

Python解法:

python

class MyQueue:
    def __init__(self):
        self.stack1 = []
        self.stack2 = []
        
    def push(self, x):
        self.stack1.append(x)
        
    def pop(self):
        if not self.stack2:
            while self.stack1:
                self.stack2.append(self.stack1.pop())
        return self.stack2.pop()
        
    def peek(self):
        if not self.stack2:
            while self.stack1:
                self.stack2.append(self.stack1.pop())
        return self.stack2[-1]
    
    def empty(self):
        return not self.stack1 and not self.stack2 
AI 代码解读

Rust解法:

rust

struct MyQueue {
    stack1: Vec<i32>,
    stack2: Vec<i32>, 
}

impl MyQueue {
    fn new() -> MyQueue {
        MyQueue { 
            stack1: Vec::new(),
            stack2: Vec::new() 
        }
    }
    
    fn push(&mut self, x: i32) {
        self.stack1.push(x);
    }
    
    fn pop(&mut self) -> i32 {
        if self.stack2.is_empty() {
            while let Some(x) = self.stack1.pop() {
                self.stack2.push(x);
            }
        }
        self.stack2.pop().unwrap()
    }  
    
    fn peek(&mut self) -> i32 {
        if self.stack2.is_empty() {
            while let Some(x) = self.stack1.pop() {
                self.stack2.push(x);
            } 
        }
        *self.stack2.last().unwrap()
    }  
    
    fn empty(&self) -> bool {
        self.stack1.is_empty() && self.stack2.is_empty()
    }
}
AI 代码解读

Go解法:

go

type MyQueue struct {
    stack1 []int
    stack2 []int
}

func Constructor() MyQueue {
    return MyQueue{
        stack1: []int{},
        stack2: []int{},
    }
}

func (q *MyQueue) Push(x int)  {
    q.stack1 = append(q.stack1, x)
}

func (q *MyQueue) Pop() int {
    if len(q.stack2) == 0 {
        for len(q.stack1) > 0 {
            q.stack2 = append(q.stack2, q.stack1[len(q.stack1)-1])
            q.stack1 = q.stack1[:len(q.stack1)-1]
        }
    }
    val := q.stack2[len(q.stack2)-1]
    q.stack2 = q.stack2[:len(q.stack2)-1]
    return val 
}

func (q *MyQueue) Peek() int {
    if len(q.stack2) == 0 {
        for len(q.stack1) > 0 {
            q.stack2 = append(q.stack2, q.stack1[len(q.stack1)-1])
            q.stack1 = q.stack1[:len(q.stack1)-1]
        }
    } 
    return q.stack2[len(q.stack2)-1]
}

func (q *MyQueue) Empty() bool {
    return len(q.stack1) == 0 && len(q.stack2) == 0 
}
AI 代码解读

JavaScript解法:

js

class MyQueue {
  constructor() {
    this.stack1 = [];
    this.stack2 = [];
  }
  
  push(x) {
    this.stack1.push(x);
  }
  
  pop() {
    if (this.stack2.length === 0) {
      while (this.stack1.length > 0) {
        this.stack2.push(this.stack1.pop());
      }
    }
    return this.stack2.pop();
  }
  
  peek() {
    if (this.stack2.length === 0) {
      while (this.stack1.length > 0) {
        this.stack2.push(this.stack1.pop());
      } 
    }
    return this.stack2[this.stack2.length - 1];
  }
  
  empty() {
    return this.stack1.length === 0 && this.stack2.length === 0; 
  }
}
AI 代码解读

解题思路:

  1. stack1用作输入栈,stack2用作输出栈。
  2. push操作直接将元素添加到stack1。
  3. pop和peek操作首先将stack1的所有元素弹出并推入stack2,然后从stack2弹出元素。
  4. empty操作判断stack1和stack2是否均为空。
  5. 使用两个栈模拟队列先入先出的特性。

时间复杂度:push O(1), pop O(N), peek O(N),空 O(1)。其中N为stack1的大小。

空间复杂度:O(N),我们需要额外的栈stack2来存储stack1中的元素。

  1. 矩阵中的路径。给定一个m x n 二维数组,判断数组中是否存在一条从左上角到右下角的路径,路径上的数字之和为定值。

Java解法:

java

public boolean exist(int[][] matrix, int target) {
    if (matrix == null || matrix.length == 0) return false;
    int rows = matrix.length, cols = matrix[0].length;
    boolean[][] visited = new boolean[rows][cols];
    return dfs(matrix, 0, 0, rows, cols, 0, target, visited);
}

private boolean dfs(int[][] matrix, int r, int c, int rows, int cols, int sum, int target, boolean[][] visited) {
    if (r == rows || c == cols) return false; 
    if (sum + matrix[r][c] == target) return true; 
    if (visited[r][c]) return false;
    visited[r][c] = true;
    
    boolean exist = dfs(matrix, r + 1, c, rows, cols, sum + matrix[r][c], target, visited) || 
                    dfs(matrix, r - 1, c, rows, cols, sum + matrix[r][c], target, visited) ||
                    dfs(matrix, r, c + 1, rows, cols, sum + matrix[r][c], target, visited) ||
                    dfs(matrix, r, c - 1, rows, cols, sum + matrix[r][c], target, visited);
                    
    visited[r][c] = false;
    return exist; 
}
AI 代码解读

Python解法:

python

def exist(self, matrix, target):
    if not matrix or not matrix[0]:
        return False
    rows, cols = len(matrix), len(matrix[0])
    visited = set()
    
    def dfs(r, c, sum):
        if r < 0 or c < 0 or r == rows or c == cols or (r, c) in visited or sum > target:
            return False
        if sum == target:
            return True
        visited.add((r, c))
        exist = dfs(r + 1, c, sum + matrix[r][c]) or dfs(r - 1, c, sum + matrix[r][c]) or \
                dfs(r, c + 1, sum + matrix[r][c]) or dfs(r, c - 1, sum + matrix[r][c])
        visited.remove((r, c))
        return exist
    
    return dfs(0, 0, 0)
AI 代码解读

Rust解法:

rust

fn exist(matrix: Vec<Vec<i32>>, target: i32) -> bool {
    if matrix.is_empty() || matrix[0].is_empty() {
        return false; 
    }
    let rows = matrix.len();
    let cols = matrix[0].len();
    let mut visited = HashSet::new();

    fn dfs(matrix: &Vec<Vec<i32>>, r: usize, c: usize, rows: usize, cols: usize, 
          sum: i32, target: i32, visited: &mut HashSet<(usize, usize)>) -> bool {
        if r == rows || c == cols || visited.contains(&(r, c)) || sum > target {
            return false; 
        }   
        if sum == target {
            return true;
        }
        visited.insert((r, c));
        let exist = dfs(matrix, r + 1, c, rows, cols, sum + matrix[r][c], target, visited) ||  
                    dfs(matrix, r - 1, c, rows, cols, sum + matrix[r][c], target, visited) ||   
                    dfs(matrix, r, c + 1, rows, cols, sum + matrix[r][c], target, visited) ||
                    dfs(matrix, r, c - 1, rows, cols, sum + matrix[r][c], target, visited);
        visited.remove(&(r, c));
        exist     
    }
    
    dfs(&matrix, 0, 0, rows, cols, 0, target, &mut visited) 
}
AI 代码解读

Go解法:

func exist(matrix [][]int, target int) bool {
if r < 0 || c < 0 || r == rows || c == cols || visitedr || sum > target {

    return false
}
if sum == target {
    return true
}
visited[r][c] = true
exist := dfs(r+1, c, sum+matrix[r][c]) || dfs(r-1, c, sum+matrix[r][c]) ||
         dfs(r, c+1, sum+matrix[r][c]) || dfs(r, c-1, sum+matrix[r][c])
visited[r][c] = false
return exist
AI 代码解读

}
return dfs(0, 0, 0)
}

JavaScript解法:
AI 代码解读
var exist = function(matrix, target) {
    if (!matrix || !matrix[0]) return false;
    const rows = matrix.length;
    const cols = matrix[0].length;
    const visited = new Set();
    
    function dfs(r, c, sum) {
        if (r < 0 || c < 0 || r === rows || c === cols || visited.has(`${r}-${c}`) || sum > target) 
            return false;
        if (sum === target) return true;
        visited.add(`${r}-${c}`);
        let exist = dfs(r + 1, c, sum + matrix[r][c]) || 
                    dfs(r - 1, c, sum + matrix[r][c]) || 
                    dfs(r, c + 1, sum + matrix[r][c]) ||
                    dfs(r, c - 1, sum + matrix[r][c]);
        visited.delete(`${r}-${c}`);
        return exist;
    }
    
    return dfs(0, 0, 0);
};
AI 代码解读

解题思路:

  1. 进行深度优先搜索,判断从左上角到达右下角的路径是否存在。
  2. dfs函数参数包含行r、列c、当前路径和sum和目标值target。
  3. base case:如果r、c超出矩阵边界或该位置已访问或当前路径和大于目标值,返回false。
  4. 如果当前路径和等于目标值,返回true。
  5. 标记当前位置已访问,并递归调用四个方向的位置。
  6. 回溯时,取消当前位置的已访问标记。
  7. 如果找到一条路径,则返回true,否则返回false。

时间复杂度:O(mn),其中m和n分别为矩阵的行数和列数。

空间复杂度:O(mn),由于递归调用,栈的深度可能达到O(mn)。

  1. 最小栈。设计一个栈,支持常规的push、pop操作,以及返回栈中最小元素的操作。
  2. 字符串全排列。给定一个字符串,返回它的所有排列组合。
  3. subsets问题。给定一组不重复的数字,返回它所有的子集。
  4. 编辑距离。计算两个字符串之间的编辑距离,允许的编辑操作包括:插入一个字符、移除一个字符、替换一个字符。
  5. 最长公共子序列。 finding the longest common subsequence (LCS) of two given strings.
  6. 设计Twitter。设计推特的简易版本,实现发布推文、关注用户、查看timeline等功能。
  7. 区间合并。给定一个区间的集合,需要合并所有重叠的区间。
  8. 二叉树的最小深度。找出二叉树的最小深度,最小深度是从根节点到最近叶子节点的最短路径上的节点数。
  9. 爬楼梯。有n个阶梯,每次可以爬1或2个阶梯,共有多少种不同的爬楼梯方法。
  10. 排序算法实现。实现常见的排序算法,如冒泡排序、选择排序、插入排序、归并排序、快速排序等。
目录
打赏
0
0
0
0
467
分享
相关文章
通义灵码 Rules 库合集来了,覆盖Java、TypeScript、Python、Go、JavaScript 等
通义灵码新上的外挂 Project Rules 获得了开发者的一致好评:最小成本适配我的开发风格、相当把团队经验沉淀下来,是个很好功能……
322 76
Python中利用遗传算法探索迷宫出路
本文探讨了如何利用Python和遗传算法解决迷宫问题。迷宫建模通过二维数组实现,0表示通路,1为墙壁,&#39;S&#39;和&#39;E&#39;分别代表起点与终点。遗传算法的核心包括个体编码(路径方向序列)、适应度函数(评估路径有效性)、选择、交叉和变异操作。通过迭代优化,算法逐步生成更优路径,最终找到从起点到终点的最佳解决方案。文末还展示了结果可视化方法及遗传算法的应用前景。
|
13天前
|
基于 Python 哈希表算法的局域网网络监控工具:实现高效数据管理的核心技术
在当下数字化办公的环境中,局域网网络监控工具已成为保障企业网络安全、确保其高效运行的核心手段。此类工具通过对网络数据的收集、分析与管理,赋予企业实时洞察网络活动的能力。而在其运行机制背后,数据结构与算法发挥着关键作用。本文聚焦于 PHP 语言中的哈希表算法,深入探究其在局域网网络监控工具中的应用方式及所具备的优势。
48 7
|
20天前
|
员工电脑监控场景下 Python 红黑树算法的深度解析
在当代企业管理范式中,员工电脑监控业已成为一种广泛采用的策略性手段,其核心目标在于维护企业信息安全、提升工作效能并确保合规性。借助对员工电脑操作的实时监测机制,企业能够敏锐洞察潜在风险,诸如数据泄露、恶意软件侵袭等威胁。而员工电脑监控系统的高效运作,高度依赖于底层的数据结构与算法架构。本文旨在深入探究红黑树(Red - Black Tree)这一数据结构在员工电脑监控领域的应用,并通过 Python 代码实例详尽阐释其实现机制。
39 6
|
24天前
|
基于 Python 迪杰斯特拉算法的局域网计算机监控技术探究
信息技术高速演进的当下,局域网计算机监控对于保障企业网络安全、优化资源配置以及提升整体运行效能具有关键意义。通过实时监测网络状态、追踪计算机活动,企业得以及时察觉潜在风险并采取相应举措。在这一复杂的监控体系背后,数据结构与算法发挥着不可或缺的作用。本文将聚焦于迪杰斯特拉(Dijkstra)算法,深入探究其在局域网计算机监控中的应用,并借助 Python 代码示例予以详细阐释。
44 6
企业用网络监控软件中的 Node.js 深度优先搜索算法剖析
在数字化办公盛行的当下,企业对网络监控的需求呈显著增长态势。企业级网络监控软件作为维护网络安全、提高办公效率的关键工具,其重要性不言而喻。此类软件需要高效处理复杂的网络拓扑结构与海量网络数据,而算法与数据结构则构成了其核心支撑。本文将深入剖析深度优先搜索(DFS)算法在企业级网络监控软件中的应用,并通过 Node.js 代码示例进行详细阐释。
40 2
如何在Python下实现摄像头|屏幕|AI视觉算法数据的RTMP直播推送
本文详细讲解了在Python环境下使用大牛直播SDK实现RTMP推流的过程。从技术背景到代码实现,涵盖Python生态优势、AI视觉算法应用、RTMP稳定性及跨平台支持等内容。通过丰富功能如音频编码、视频编码、实时预览等,结合实际代码示例,为开发者提供完整指南。同时探讨C接口转换Python时的注意事项,包括数据类型映射、内存管理、回调函数等关键点。最终总结Python在RTMP推流与AI视觉算法结合中的重要性与前景,为行业应用带来便利与革新。
基于 Python 哈希表算法的员工上网管理策略研究
于当下数字化办公环境而言,员工上网管理已成为企业运营管理的关键环节。企业有必要对员工的网络访问行为予以监控,以此确保信息安全并提升工作效率。在处理员工上网管理相关数据时,适宜的数据结构与算法起着举足轻重的作用。本文将深入探究哈希表这一数据结构在员工上网管理场景中的应用,并借助 Python 代码示例展开详尽阐述。
43 3
Python下的毫秒级延迟RTSP|RTMP播放器技术探究和AI视觉算法对接
本文深入解析了基于Python实现的RTSP/RTMP播放器,探讨其代码结构、实现原理及优化策略。播放器通过大牛直播SDK提供的接口,支持低延迟播放,适用于实时监控、视频会议和智能分析等场景。文章详细介绍了播放控制、硬件解码、录像与截图功能,并分析了回调机制和UI设计。此外,还讨论了性能优化方法(如硬件加速、异步处理)和功能扩展(如音量调节、多格式支持)。针对AI视觉算法对接,文章提供了YUV/RGB数据处理示例,便于开发者在Python环境下进行算法集成。最终,播放器凭借低延迟、高兼容性和灵活扩展性,为实时交互场景提供了高效解决方案。
124 4
基于 Node.js 深度优先搜索算法的上网监管软件研究
在数字化时代,网络环境呈现出高度的复杂性与动态性,上网监管软件在维护网络秩序与安全方面的重要性与日俱增。此类软件依托各类数据结构与算法,实现对网络活动的精准监测与高效管理。本文将深度聚焦于深度优先搜索(DFS)算法,并结合 Node.js 编程语言,深入剖析其在上网监管软件中的应用机制与效能。
35 6

云原生

+关注
下一篇
oss创建bucket
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等