栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

2022-06-27:给出一个长度为n的01串,现在请你找到两个区间, 使得这两个区间中,1的个数相等,0的个数也相等, 这两个区间可以相交,但是不可以完全重叠,即两个区间的左右端点不可以完全一样。

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

2022-06-27:给出一个长度为n的01串,现在请你找到两个区间, 使得这两个区间中,1的个数相等,0的个数也相等, 这两个区间可以相交,但是不可以完全重叠,即两个区间的左右端点不可以完全一样。

2022-06-27:给出一个长度为n的01串,现在请你找到两个区间,
使得这两个区间中,1的个数相等,0的个数也相等,
这两个区间可以相交,但是不可以完全重叠,即两个区间的左右端点不可以完全一样。
现在请你找到两个最长的区间,满足以上要求。
来自百度。

答案2022-06-27:

这道题取巧了。用动态规划不是取巧的方式。
L0=最左0和最右0的长度,L1=最左1和最右1的长度,求L0和L1的最大值即可。

代码用rust编写。代码如下:

use rand::Rng;
use std::collections::HashMap;
fn main() {
    let n: i32 = 500;
    let test_time: i32 = 10000;
    println!("测试开始");
    for i in 0..test_time {
        let size = rand::thread_rng().gen_range(0, n) + 2;
        let mut arr = random_array(size);
        let ans1 = longest1(&mut arr);
        let ans2 = longest2(&mut arr);
        if ans1 != ans2 {
            println!("出错了!{}", i);
            println!("ans1 = {}", ans1);
            println!("ans2 = {}", ans2);
            break;
        }
    }
    println!("测试结束");
}

fn longest1(arr: &mut Vec) -> i32 {
    let mut map: HashMap> = HashMap::new();
    for i in 0..arr.len() as i32 {
        let mut zero = 0;
        let mut one = 0;
        for j in i..arr.len() as i32 {
            zero += if arr[j as usize] == 0 { 1 } else { 0 };
            one += if arr[j as usize] == 1 { 1 } else { 0 };
            map.entry(zero).or_insert(HashMap::new());
            let mapzero = map.get_mut(&zero).unwrap();
            mapzero.insert(one, if mapzero.get(&one) == None { 0 } else { 1 } + 1);
        }
    }
    let mut ans = 0;
    for (k, v) in map.iter() {
        for (k2, v2) in v.iter() {
            let num = *v2;
            if num > 1 {
                ans = get_max(ans, k + k2);
            }
        }
    }
    return ans;
}

fn get_max(a: T, b: T) -> T {
    if a > b {
        a
    } else {
        b
    }
}

fn longest2(arr: &mut Vec) -> i32 {
    let mut left_zero = -1;
    let mut right_zero: i32 = -1;
    let mut left_one = -1;
    let mut right_one: i32 = -1;
    for i in 0..arr.len() as i32 {
        if arr[i as usize] == 0 {
            left_zero = i;
            break;
        }
    }
    for i in 0..arr.len() as i32 {
        if arr[i as usize] == 1 {
            left_one = i;
            break;
        }
    }
    let mut i = arr.len() as i32 - 1;
    while i >= 0 {
        if arr[i as usize] == 0 {
            right_zero = i;
            break;
        }
        i -= 1;
    }
    let mut i = arr.len() as i32 - 1;
    while i >= 0 {
        if arr[i as usize] == 1 {
            right_one = i;
            break;
        }
        i -= 1;
    }
    let p1 = right_zero - left_zero;
    let p2 = right_one - left_one;
    return get_max(p1, p2);
}

// 为了测试
fn random_array(len: i32) -> Vec {
    let mut arr: Vec = vec![];
    for _i in 0..len {
        arr.push(rand::thread_rng().gen_range(0, 2));
    }
    return arr;
}

执行结果如下:


左神java代码

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/995199.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号