华为OD 2023机试题java python c++ go rust

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
简介: 华为OD 2023机试题java python c++ go rust

给定一个字符串 s ,找出这样一个子串:

1)该子串中的任意一个字符最多出现2次;

2)该子串不包含指定某个字符;

请你找出满足该条件的最长子串的长度。

输入描述:第一行为要求不包含的指定字符,为单个字符,取值范围0-9a-zA-Z

第二行为字符串s,每个字符范围0-9a-zA-Z,长度范围1,10000

输出描述:一个整数,满足条件的最长子串的长度;如果不存在满足条件的子串,则返回0

示例

示例1

输入:

D

ABC123

输出:6

示例2

输入:

D

ABACA123D

输出:7

解题思路

我们定义left和right两个指针,左右指针代表当前考察的子串的左右边界。

在移动右指针时,如果新加入的字符没有出现过,或者出现次数没有超过2次,我们就扩大窗口,并更新最大长度。

如果新加入的字符已经出现过2次,我们就收缩窗口的左侧边界,直到移除了一个重复出现的字符。

我们重复这个过程,直到right指针遍历完整个字符串,就可以得到满足条件的最长子串长度。

时间复杂度:O(n)O(n),n为字符串长度。

空间复杂度:O(1)O(1)。

Java实现

import java.util.HashSet;
import java.util.Set;
public class LongestSubstring {
    public int lengthOfLongestSubstring(String s, char excluded) {
        Set<Character> set = new HashSet<>();
        int left = 0, right = 0;
        int max = 0;
        while (right < s.length()) {
            if (set.add(s.charAt(right))) {
                max = Math.max(max, right - left + 1);
                right++;
            } else {
                set.remove(s.charAt(left++));
            }
        }
        return max;
    }
    public static void main(String[] args) {
        LongestSubstring solution = new LongestSubstring();
        String s = "ABC123";
        char c = 'D';
        System.out.println(solution.lengthOfLongestSubstring(s, c));
    }
}

python

class LongestSubstring:
    def lengthOfLongestSubstring(self, s, excluded):
        s = list(s)
        set = set() # 创建一个空集合
        left = 0 # 初始化左指针
        right = 0 # 初始化右指针
        max = 0 # 初始化最大子串长度
        while right < len(s):
            if s[right] not in set: # 如果当前字符不在集合中
                set.add(s[right]) # 将当前字符加入集合
                max = max(max, right - left + 1) # 更新最大子串长度
                right += 1 # 右指针右移
            else:
                set.remove(s[left]) # 将左指针指向的字符从集合中移除
                left += 1 # 左指针右移
        return max # 返回最大子串长度

solution = LongestSubstring()
s = "ABC123"
c = 'D'
print(solution.lengthOfLongestSubstring(s, c)) # 输出最大子串长度

C++

#include <iostream>
#include <unordered_set>
using namespace std;

class LongestSubstring {
public:
    int lengthOfLongestSubstring(string s, char excluded) {
        unordered_set<char> set; // 创建一个无序集合
        int left = 0, right = 0; // 初始化左右指针
        int max = 0; // 初始化最大长度
        while (right < s.length()) { // 当右指针小于字符串长度时
            if (set.insert(s[right]).second) { // 如果插入成功
                max = std::max(max, right - left + 1); // 更新最大长度
                right++; // 右指针右移
            } else { // 如果插入失败
                set.erase(s[left++]); // 左指针右移
            }
        }
        return max; // 返回最大长度
    }
};

int main() {
    LongestSubstring solution; // 创建一个 LongestSubstring 类的实例
    string s = "ABC123"; // 初始化字符串
    char c = 'D'; // 初始化排除字符
    cout << solution.lengthOfLongestSubstring(s, c) << endl; // 输出最大长度
    return 0;
}

go

// 将给定字符串s转换为字符数组
s := []rune(s)

// 创建一个空map,用于存储字符出现的位置
set := make(map[rune]int)

// 初始化左指针和最大子串长度
left, max := 0, 0

// 遍历字符串
for right, char := range s {
    // 如果字符已经在map中出现过,并且出现位置在左指针右侧
    if _, ok := set[char]; ok && set[char] >= left {
        // 将左指针移动到该字符出现位置的右侧
        left = set[char] + 1
    }
    // 更新最大子串长度
    max = int(math.Max(float64(max), float64(right-left+1)))
    // 将字符出现位置存入map中
    set[char] = right
}

// 返回最大子串长度
return max

rust

// 将给定字符串s转换为字符数组
let s: Vec<char> = s.chars().collect();

// 创建一个空map,用于存储字符出现的位置
let mut set: HashMap<char, usize> = HashMap::new();

// 初始化左指针和最大子串长度
let (mut left, mut max) = (0, 0);

// 遍历字符串
for right in 0..s.len() {
    let char = s[right];
    // 如果字符已经在map中出现过,并且出现位置在左指针右侧
    if let Some(&pos) = set.get(&char) {
        if pos >= left {
            // 将左指针移动到该字符出现位置的右侧
            left = pos + 1;
        }
    }
    // 更新最大子串长度
    max = max.max(right - left + 1);
    // 将字符出现位置存入map中
    set.insert(char, right);
}

// 返回最大子串长度
max
  1. 实现一个函数,判断一棵二叉树是否对称。例如:下面这棵树是对称的。    
 1

   /  \

  2    2

 / \  / \

3  4 4  3

伪代码思路

定义一个函数判断二叉树是否对称,需要传入根节点和父节点。

如果当前节点是左子树的根节点,则递归判断右子树是否对称。

如果当前节点是右子树的根节点,则递归判断左子树是否对称。

如果左右子树都不对称,则返回false。

如果左右子树都对称,则返回true。

在主函数中调用该函数,传入根节点和父节点进行测试。

java

class TreeNode {
    int val;
    TreeNode left;
    TreeNode right;
    TreeNode(int x) { val = x; }
}

public boolean isSymmetric(TreeNode root) {
    if (root == null) return true;
    return check(root.left, root.right) && isSymmetric(root.left) && isSymmetric(root.right);
}

private boolean check(TreeNode left, TreeNode right) {
    if (left == null && right == null) return true; // 如果左右子树都为空,则对称
    if (left == null || right == null) return false; // 如果左右子树有一个为空,则不对称
    if (left.val != right.val) return false; // 如果左右子树的值不相等,则不对称
    return check(left.left, right.right) && check(left.right, right.left); // 分别递归检查左右子树是否对称
}

public static void main(String[] args) {
        // 创建一棵二叉树并测试对称性
        TreeNode root = new TreeNode(1);
        root.left = new TreeNode(2);
        root.right = new TreeNode(2);
        root.right.left = new TreeNode(3);
        root.right.right = new TreeNode(4);
        root.right.left.right = new TreeNode(4);
        boolean result = isSymmetric(root);
        System.out.println(result); // 输出true,表示该二叉树是对称的
    }

python

class TreeNode:
    def __init__(self, val=0, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right

def isSymmetric(root: TreeNode) -> bool:
    if root is None:
        return True
    return check(root.left, root.right) and isSymmetric(root.left) and isSymmetric(root.right)

def check(left: TreeNode, right: TreeNode) -> bool:
    if left is None and right is None:
        return True # 如果左右子树都为空,则对称
    if left is None or right is None:
        return False # 如果左右子树有一个为空,则不对称
    if left.val != right.val:
        return False # 如果左右子树的值不相等,则不对称
    return check(left.left, right.right) and check(left.right, right.left) # 分别递归检查左右子树是否对称

c++

class TreeNode{
    public:
    int val;
    TreeNode* left;
    TreeNode* right;
    TreeNode(int val=0, TreeNode* left=nullptr, TreeNode* right=nullptr){
        this->val = val;
        this->left = left;
        this->right = right;
    }
};

bool isSymmetric(TreeNode* root){
    if(root == nullptr){
        return true;
    }
    return check(root->left, root->right) && isSymmetric(root->left) && isSymmetric(root->right);
}

bool check(TreeNode* left, TreeNode* right){
    if(left == nullptr && right == nullptr){
        return true; 
        // 如果左右子树都为空,则对称
    }
    if(left == nullptr || right == nullptr){
        return false; 
        // 如果左右子树有一个为空,则不对称
    }
    if(left->val != right->val){
        return false;
        // 如果左右子树的值不相等,则不对称
    }
    return check(left->left, right->right) && check(left->right, right->left);
    // 分别递归检查左右子树是否对称
}

go

type TreeNode struct {
    val int
    left *TreeNode
    right *TreeNode
}

func isSymmetric(root *TreeNode) bool {
    if root == nil {
        return true
    }
    return check(root.left, root.right) && isSymmetric(root.left) && isSymmetric(root.right)
}

func check(left *TreeNode, right *TreeNode) bool {
    if left == nil && right == nil {
        return true
        // 如果左右子树都为空,则对称
    }
    if left == nil || right == nil {
        return false
        // 如果左右子树有一个为空,则不对称
    }
    if left.val != right.val {
        return false
        // 如果左右子树的值不相等,则不对称
    }
    return check(left.left, right.right) && check(left.right, right.left)
    // 分别递归检查左右子树是否对称
}

rust

type TreeNode struct {
    val: i32,
    left: Option<Box<TreeNode>>,
    right: Option<Box<TreeNode>>,
}

fn is_symmetric(root: Option<&Box<TreeNode>>) -> bool {
    match root {
        None => true,
        Some(node) => check(&node.left, &node.right) && is_symmetric(node.left.as_ref()) && is_symmetric(node.right.as_ref())
    }
}

fn check(left: &Option<Box<TreeNode>>, right: &Option<Box<TreeNode>>) -> bool {
    match (left, right) {
        (None, None) => true,
        (None, _) | (_, None) => false,
        (Some(l), Some(r)) => l.val == r.val && check(&l.left, &r.right) && check(&l.right, &r.left)
    }
}

js

type TreeNode = class {
    constructor(val, left=null, right=null) {
        this.val = val;
        this.left = left;
        this.right = right;
    }
}

function isSymmetric(root) {
    function check(left, right) {
        if (!left && !right) {
            return true;
        }
        if (!left || !right) {
            return false;
        }
        return left.val == right.val && check(left.left, right.right) && check(left.right, right.left);
    }
    if (!root) {
        return true;
    }
    return check(root.left, root.right) && isSymmetric(root.left) && isSymmetric(root.right);
}

  1. 实现单例模式,要求线程安全。
  2. 实现冒泡排序,选择排序,插入排序。并分析三种排序算法的时间复杂度。
  3. 给你两个有序整数数组nums1 和 nums2,请你将 nums2 合并到nums1中,使得nums1 成为一个有序数组。
  4. 给定一个链表,判断是否有环。如果有环,返回入环节点,否则返回null。
  5. 编写一个函数,输入是一个无序链表,输出一个从小到大排序的有序链表。
  6. 实现一个LRU cache,要求get和set方法的时间复杂度为O(1)。
  7. 给出两个字符串s1和s2,请实现一个函数判断s2是否是s1的变位词。
  8. 实现队列的入队和出队操作,要求出队操作pop的时间复杂度为O(1)。

11.给定一个32位整数,返回该整数中1的个数。例如:给定整数11,返回2。给定整数128,返回1。

利用n & (n - 1)会将n的最后一个1变为0的特性。

每循环一次,就找到一个1,并将其变为0。循环终止的条件是n变为0,count的值就是n中1的个数。例如:

n = 11,

11 & (11 - 1) = 11 & 10 = 10   // 找到一个1,count变为1

10 & (10 - 1) = 10 & 9 = 8     // 找到一个1,count变为2

8 & (8 - 1) = 8 & 7 = 0        // n变为0,循环终止,count值为2 n = 128

128 & (128 - 1) = 128 & 127 = 0   // 找到一个1,count变为1,n变为0,循环终止,count值为1所以时间复杂度是O(k),k是n中1的个数。空间复杂度O(1)。

java

public int countOnes(int n) {
    int count = 0;
    while (n != 0) {
        n &= (n - 1);
        count++;
    }
    return count;
}

python

def countOnes(n):
    count = 0
    while n != 0:
        n &= (n - 1)
        count += 1
    return count

c++

public:
    int countOnes(int n) {
        int count = 0;
        while (n != 0) {
            n &= (n - 1);
            count++;
        }
        return count;
    }

go

public:
    func countOnes(n int) int {
        count := 0
        for n != 0 {
            n &= (n - 1)
            count++
        }
        return count
    } 

rust

pub fn count_ones(n: i32) -> i32 {
    let mut count = 0;
    let mut m = n;
    while m != 0 {
        m &= m - 1;
        count += 1;
    }
    count
}
目录
相关文章
|
1月前
|
Rust 资源调度 安全
为什么使用 Rust over C++ 进行 IoT 解决方案开发
为什么使用 Rust over C++ 进行 IoT 解决方案开发
68 7
|
2月前
|
Java Android开发 C++
🚀Android NDK开发实战!Java与C++混合编程,打造极致性能体验!📊
在Android应用开发中,追求卓越性能是不变的主题。本文介绍如何利用Android NDK(Native Development Kit)结合Java与C++进行混合编程,提升应用性能。从环境搭建到JNI接口设计,再到实战示例,全面展示NDK的优势与应用技巧,助你打造高性能应用。通过具体案例,如计算斐波那契数列,详细讲解Java与C++的协作流程,帮助开发者掌握NDK开发精髓,实现高效计算与硬件交互。
137 1
|
3月前
|
安全 Java Go
Java&Go泛型对比
总的来说,Java和Go在泛型的实现和使用上各有特点,Java的泛型更注重于类型安全和兼容性,而Go的泛型在保持类型安全的同时,提供了更灵活的类型参数和类型集的概念,同时避免了运行时的性能开销。开发者在使用时可以根据自己的需求和语言特性来选择使用哪种语言的泛型特性。
49 7
|
3月前
|
Rust 安全 C++
系统编程的未来之战:Rust能否撼动C++的王座?
【8月更文挑战第31天】Rust与C++:现代系统编程的新选择。C++长期主导系统编程,但内存安全问题频发。Rust以安全性为核心,通过所有权和生命周期概念避免内存泄漏和野指针等问题。Rust在编译时确保内存安全,简化并发编程,其生态系统虽不及C++成熟,但发展迅速,为现代系统编程提供了新选择。未来有望看到更多Rust驱动的系统级应用。
62 1
|
3月前
|
Rust 安全 Java
Java代码规范--排版,命名.:Rust能否撼动C++的王座?
系统编程是计算机科学的核心,C++长期占据主导地位,但其内存安全问题备受诟病。Rust以安全性为核心,通过所有权和生命周期概念避免了野指针和内存泄漏。此外,Rust的并发模型和日益丰富的生态系统使其成为现代系统编程的新选择,尤其在安全性和并发性方面表现出色。尽管C++依然强大,但Rust为开发者提供了更安全、易管理的选项,未来有望推动更多系统级应用的发展。
26 0
|
3月前
|
Rust 安全 C++
游戏引擎的未来:是Rust成为新王,还是C++仍占鳌头?
【8月更文挑战第31天】随着游戏行业的快速发展,对高性能、安全且易维护的游戏引擎需求日益增长。虽然C++长期占据主导地位,但Rust语言凭借其内存安全和高性能的特点,逐渐成为游戏引擎开发的新选择。Rust通过所有权机制和强大的类型系统,在保证内存安全的同时实现了与C++相当的性能,有助于提前发现潜在错误。尽管Rust在生态系统成熟度和学习曲线上仍面临挑战,其在游戏引擎领域的潜力正逐渐被认可。随着Rust社区的发展和工具链的完善,Rust有望成为游戏引擎开发的重要选项。
187 0
|
4月前
|
Java Android开发 C++
🚀Android NDK开发实战!Java与C++混合编程,打造极致性能体验!📊
【7月更文挑战第28天】在 Android 开发中, NDK 让 Java 与 C++ 混合编程成为可能, 从而提升应用性能。**为何选 NDK?** C++ 在执行效率与内存管理上优于 Java, 特别适合高性能需求场景。**环境搭建** 需 Android Studio 和 NDK, 工具如 CMake。**JNI** 构建 Java-C++ 交互, 通过声明 `native` 方法并在 C++ 中实现。**实战** 示例: 使用 C++ 计算斐波那契数列以提高效率。**总结** 混合编程增强性能, 但增加复杂性, 使用前需谨慎评估。
141 4
|
4月前
|
Web App开发 Rust 分布式计算
Rust与C++的区别及使用问题之对于大量使用C++实现的产品来说,迁移到Rust的问题如何解决
Rust与C++的区别及使用问题之对于大量使用C++实现的产品来说,迁移到Rust的问题如何解决
|
4月前
|
Rust 安全 编译器
Rust与C++的区别及使用问题之Rust中的bound check对性能产生影响的问题如何解决
Rust与C++的区别及使用问题之Rust中的bound check对性能产生影响的问题如何解决
|
4月前
|
Rust 测试技术 编译器
Rust与C++的区别及使用问题之Rust项目中组织目录结构的问题如何解决
Rust与C++的区别及使用问题之Rust项目中组织目录结构的问题如何解决

热门文章

最新文章

下一篇
无影云桌面