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

答案2022-06-27:

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

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

  1. use rand::Rng;
  2. use std::collections::HashMap;
  3. fn main() {
  4. let n: i32 = 500;
  5. let test_time: i32 = 10000;
  6. println!("测试开始");
  7. for i in 0..test_time {
  8. let size = rand::thread_rng().gen_range(0, n) + 2;
  9. let mut arr = random_array(size);
  10. let ans1 = longest1(&mut arr);
  11. let ans2 = longest2(&mut arr);
  12. if ans1 != ans2 {
  13. println!("出错了!{}", i);
  14. println!("ans1 = {}", ans1);
  15. println!("ans2 = {}", ans2);
  16. break;
  17. }
  18. }
  19. println!("测试结束");
  20. }
  21. fn longest1(arr: &mut Vec<i32>) -> i32 {
  22. let mut map: HashMap<i32, HashMap<i32, i32>> = HashMap::new();
  23. for i in 0..arr.len() as i32 {
  24. let mut zero = 0;
  25. let mut one = 0;
  26. for j in i..arr.len() as i32 {
  27. zero += if arr[j as usize] == 0 { 1 } else { 0 };
  28. one += if arr[j as usize] == 1 { 1 } else { 0 };
  29. map.entry(zero).or_insert(HashMap::new());
  30. let mapzero = map.get_mut(&zero).unwrap();
  31. mapzero.insert(one, if mapzero.get(&one) == None { 0 } else { 1 } + 1);
  32. }
  33. }
  34. let mut ans = 0;
  35. for (k, v) in map.iter() {
  36. for (k2, v2) in v.iter() {
  37. let num = *v2;
  38. if num > 1 {
  39. ans = get_max(ans, k + k2);
  40. }
  41. }
  42. }
  43. return ans;
  44. }
  45. fn get_max<T: Clone + Copy + std::cmp::PartialOrd>(a: T, b: T) -> T {
  46. if a > b {
  47. a
  48. } else {
  49. b
  50. }
  51. }
  52. fn longest2(arr: &mut Vec<i32>) -> i32 {
  53. let mut left_zero = -1;
  54. let mut right_zero: i32 = -1;
  55. let mut left_one = -1;
  56. let mut right_one: i32 = -1;
  57. for i in 0..arr.len() as i32 {
  58. if arr[i as usize] == 0 {
  59. left_zero = i;
  60. break;
  61. }
  62. }
  63. for i in 0..arr.len() as i32 {
  64. if arr[i as usize] == 1 {
  65. left_one = i;
  66. break;
  67. }
  68. }
  69. let mut i = arr.len() as i32 - 1;
  70. while i >= 0 {
  71. if arr[i as usize] == 0 {
  72. right_zero = i;
  73. break;
  74. }
  75. i -= 1;
  76. }
  77. let mut i = arr.len() as i32 - 1;
  78. while i >= 0 {
  79. if arr[i as usize] == 1 {
  80. right_one = i;
  81. break;
  82. }
  83. i -= 1;
  84. }
  85. let p1 = right_zero - left_zero;
  86. let p2 = right_one - left_one;
  87. return get_max(p1, p2);
  88. }
  89. // 为了测试
  90. fn random_array(len: i32) -> Vec<i32> {
  91. let mut arr: Vec<i32> = vec![];
  92. for _i in 0..len {
  93. arr.push(rand::thread_rng().gen_range(0, 2));
  94. }
  95. return arr;
  96. }

执行结果如下:


左神java代码

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

  1. 用最小的空间复杂度找出一个长度为n的数组且数据中的元素是[0,n-1]中任一个重复的数据。

    用最小的空间复杂度找出一个长度为n的数组且数据中的元素是[0,n-1]中任一个重复的数据. 比如:[1, 2, 3, 3, 2, 2, 6, 7, 8, 9] 中 2 or 3 分析:这道题目,实现比 ...

  2. 给出一个长度为n的数列,请对于每一个数,输出他右边第一个比他大的数。n<=100000.

    RT,一个ppt里看到的题,不过没讲做法.百度上基本搜不到.自己想了个做法,理论上可行,复杂度也是O(nlogn). 首先,做一次RMQ,求区间最大值. 对于任意一个数s[i],可以用logn的时间求 ...

  3. 算法 - 给出一个字符串str,输出包含两个字符串str的最短字符串,如str为abca时,输出则为abcabca

    今天碰到一个算法题觉得比较有意思,研究后自己实现了出来,代码比较简单,如发现什么问题请指正.思路和代码如下: 基本思路:从左开始取str的最大子字符串,判断子字符串是否为str的后缀,如果是则返回st ...

  4. 给定数组a[1,2,3],用a里面的元素来生成一个长度为5的数组,打印出其排列组合

    给定数组a[1,2,3],用a里面的元素来生成一个长度为5的数组,打印出其排列组合 ruby代码: def all_possible_arr arr, length = 5 ret = [] leng ...

  5. JS函数 编程练习 使用javascript代码写出一个函数:实现传入两个整数后弹出较大的整数。

    编程练习 使用javascript代码写出一个函数:实现传入两个整数后弹出较大的整数. 任务 第一步: 编写代码完成一个函数的定义吧. 第二步: 我们来补充函数体中的控制语句,完成函数功能吧. 提示: ...

  6. 现在有一个长度20的SET,其中每个对象的内容是随机生成的字符串,请写出遍历删除LIST里面字符串含"2"的对象的代码。

    现在有一个长度20的SET,其中每个对象的内容是随机生成的字符串,请写出遍历删除LIST里面字符串含"2"的对象的代码. public class RemoveTwo { //le ...

  7. ZT CSDN 如何以最快的速度计算出一个二进制数中1的个数? [

    一道算法面试题:如何以最快的速度计算出一个二进制数中1的个数? [问题点数:10分,结帖人weicai_chen] 收藏 weicai_chen weicai_chen 等级: 结帖率:95.12% ...

  8. 笔试题&amp;面试题:找出一个数组中第m小的值并输出

    题目:找出一个数组中第m小的值并输出. 代码: #include <stdio.h> int findm_min(int a[], int n, int m) //n代表数组长度,m代表找 ...

  9. 如何写出一个让人很难发现的bug?

    程序员的日常三件事:写bug.改bug.背锅.连程序员都自我调侃道,为什么每天都在加班?因为我的眼里常含bug. 那么如何写出一个让(坑)人(王)很(之)难(王)发现的bug呢? - 1 -新手开发+ ...

  10. 浅谈如何写出一个让(坑)人(王)很(之)难(王)发现的bug

    该文章内容来自脚本之家,原文链接:https://www.jb51.net/news/598404.html 程序员的日常三件事:写bug.改bug.背锅.连程序员都自我调侃道,为什么每天都在加班?因 ...

随机推荐

  1. bind、call、apply区别

    bind.call.apply都是用来改变函数内部this指向的方法,使用上仅有细微差别 一.代码 function person(p1, p2, p3) { console.log('this: ' ...

  2. STM32的USART的DMA不定长度收发代码

    /* * 函数名:USART1_DMA_Config * 描述  :串口1的DMA 的初始化配置 * 输入  :无 * 输出  : 无 * 调用  :在USART1_INIT()中被调用 */ voi ...

  3. IDEA如何使用Maven不通过模板创建javaWeb项目

    IDEA如何使用Maven不通过模板创建javaWeb项目 1.创建项目 进入IDEA,点击"项目">"新建项目",填写项目信息,最后点击"创建 ...

  4. markdown常用语法及Typora的使用

    一.markdown markdown简介   markdown是一种文档格式,后缀名为.md.markdown非常适于写博客,基本所有博客网站都支持markdown语法格式. 1.标题   mark ...

  5. MySQL学习(九)frm与ibd了解

    参考:https://cloud.tencent.com/developer/article/1533746 InnoDB: frm,ibd MyISAM: frm,myd,myi ibd是InnoD ...

  6. 【Eolink】Apikit V10.8.0 版本发布!增加支持 DUBBO、TCP、SOAP 、HSF、UDP 的接口协议

    Apikit 最新功能来袭! 我们在这个版本实现了接口管理和测试能力的全面升级,包括且不限于: 新增功能速览: 增加支持 DUBBO.TCP.SOAP .HSF.UDP 接口文档和协议 接口文档可自动 ...

  7. 【小白晋级大师】如何设计一个支持10万人用的ChatGPT对接系统

    不停地书写,方能不失在人海茫茫. 1.前言 之前给大家写了ChatGPT对接企业微信的教程,具体可看知乎链接: [奶奶看了都会]ChatGPT3.5接入企业微信,可连续对话 文章结尾说了教程只能适用于 ...

  8. 别逛了,送你一份2023年Java核心篇JVM(虚拟机)面试题整理

    Java内存区域 说一下 JVM 的主要组成部分及其作用? JVM包含两个子系统和两个组件,两个子系统为Class loader(类装载).Execution engine(执行引擎):两个组件为Ru ...

  9. selenium之文件的上传

    文件的上传:主要是两种实现方法: 1.如果定位的元素是type类型是file类型的话,那么直接定位元素并使用send_keys方法完成文件上传 2.如果是非file类型的话,则需要使用第三方工具完成文 ...

  10. C# Kafka重置到最新的偏移量,即从指定的Partition订阅消息使用Assign方法

    在使用Kafka的过程中,消费者断掉之后,再次开始消费时,消费者会从断掉时的位置重新开始消费. 场景再现:比如昨天消费者晚上断掉了,今天上午我们会发现kafka消费的数据不是最新的,而是昨天晚上的数据 ...