2024-11-20:交替子数组计数。用go语言,给定一个二进制数组 nums,

如果一个子数组中的相邻元素的值都不相同,我们称这个子数组为交替子数组。

请返回数组 nums 中交替子数组的总数。

输入: nums = [0,1,1,1]。

输出: 5。

解释:

以下子数组是交替子数组:[0] 、[1] 、[1] 、[1] 以及 [0,1] 。

答案2024-11-20:

chatgpt

题目来自leetcode3101。

大体步骤如下:

1.输入数据:首先,我们有一个二进制数组 nums,例如 nums = [0, 1, 1, 1]。我们的目标是计算这个数组中所有交替子数组的数量。

2.交替子数组的定义:交替子数组是指一个子数组中,相邻的元素值必须不同。例如:

2.1.数组 [0][1] 都是交替子数组,因为它们的元素没有相邻重复的情况。

2.2.数组 [1, 1] 不是交替子数组,因为两个相邻的元素都是 1。

3.初始化变量

3.1.res:用于存放交替子数组的总数,初始值为 0。

3.2.cur:用于记录当前交替子数组的长度,初始值为 0。

3.3.pre:一个辅助变量,用于保存前一个元素的值,初始设置为 -1(方便与第一个元素进行比较)。

4.遍历数组

4.1.对于给定的数组 nums 中的每一个元素 a,执行以下操作:

4.1.1.非重复情况:如果当前元素 a 与前一个元素 pre 不相等,表示交替状态继续,故将当前计数 cur 加 1。

4.1.2.重复情况:如果当前元素 a 与前一个元素 pre 相等,则交替状态被破坏,将当前计数 cur 重置为 1,表示当前元素 a 作为新的交替子数组的起始元素。

4.1.3.更新 pre 为当前的元素 a,以便于下一次迭代进行比较。

4.1.4.将当前的 cur 值累加到总数 res 中。这将确保包含所有以当前元素为结束元素的交替子数组。

5.结束遍历:当遍历完整个数组后,res 将包含所有可能的交替子数组的总数。

6.返回结果:最后,函数返回 res,这就是我们需要的交替子数组的数量。

示例分析

以输入 nums = [0, 1, 1, 1] 作为示例:

  • 处理第一个元素 0cur 增加到 1,res 变为 1(子数组 [0])。

  • 处理第二个元素 1cur 增加到 2,res 变为 3(包括子数组 [1][0, 1])。

  • 处理接下来的两个元素 1

    • 对于第一个重复 1,由于与前面的 pre(也是 1)相等,cur 重置为 1,res 增加到 4(子数组 [1])。

    • 对于第二个重复 1,同样,cur 重置为 1,res 增加到 5(再加上 [1])。

  • 因此,最后输出结果为 5,包含的交替子数组为 [0][1][1][1][0, 1]

时间复杂度和空间复杂度

  • 时间复杂度:O(n),其中 n 是数组 nums 的长度。由于只需对数组遍历一次进行计算,所需的操作量与数组长度成正比。

  • 空间复杂度:O(1),因为使用的变量(rescurpre)都是常数空间,不依赖于输入数组的大小,未使用额外的数据结构进行存储。

Go完整代码如下:

package main

import (
"fmt"
) func countAlternatingSubarrays(nums []int) int64 {
var res, cur int64
pre := -1
for _, a := range nums {
if pre != a {
cur++
} else {
cur = 1
}
pre = a
res += cur
}
return res
} func main() {
nums := []int{0, 1, 1, 1}
fmt.Println(countAlternatingSubarrays(nums))
}

Rust完整代码如下:

fn count_alternating_subarrays(nums: Vec<i32>) -> i64 {
let mut res = 0;
let mut cur = 0;
let mut pre = -1; // 用于记录前一个值 for &a in &nums {
if pre != a {
cur += 1; // 如果不相同,当前交替子数组长度加1
} else {
cur = 1; // 如果相同,重置为1
}
pre = a;
res += cur; // 累加交替子数组的数量
} res // 返回结果
} fn main() {
let nums = vec![0, 1, 1, 1];
println!("{}", count_alternating_subarrays(nums));
}

2024-11-20:交替子数组计数。用go语言,给定一个二进制数组 nums, 如果一个子数组中的相邻元素的值都不相同,我们称这个子数组为交替子数组。 请返回数组 nums 中交替子数组的总数。 输的更多相关文章

  1. 输出有序数组的中两个元素差值为指定值diff的两个元素

    题目: 输出有序数组的中两个元素差值为指定值diff的两个元素. 思路: 这与输出两个元素的和的值为一定值类似,需要两个指针,不同的是:指针不是一左一右,而是一前一后. 如果差值等于diff,则返回: ...

  2. 遍历查找集合或者数组中的某个元素的值 java代码 详解 Android开发

    import java.util.Scanner; public class Test21 { public static void main(String[] args) { //定义并初始化数组 ...

  3. c语言实践 创建两个包含8个元素的double类型数组,第二个元素的每个元素的值都是对应前一个元素的前n个元素的和

    意思就是第二个元素的num[2]等于第一个元素的num[0]+num[1]+num[2] #define COUNT 8 int main(void) { double num1[COUNT]; do ...

  4. 给定一个double类型的数组arr,其中的元素可正可负可0,返回子数组累乘的最大乘积。例如arr=[-2.5,4,0,3,0.5,8,-1],子数组[3,0.5,8]累乘可以获得最大的乘积12,所以返回12。

    分析,是一个dp的题目, 设f[i]表示以i为结尾的最大值,g[i]表示以i结尾的最小值,那么 f[i+1] = max{f[i]*arr[i+1], g[i]*arr[i+1],arr[i+1]} ...

  5. 给定一个整数数组nums和一个整数目标值target,请你在该数组中找出和为目标值target的那两个整数,并返回它们的数组下标。

    /** * 给定一个整数数组nums和一个整数目标值target,请你在该数组中找出和为目标值target的那两个整数,并返回它们的数组下标. * * 你可以假设每种输入只会对应一个答案.但是,数组中 ...

  6. JavaScript正则表达式模式匹配(4)——使用exec返回数组、捕获性分组和非捕获性分组、嵌套分组

    使用exec返回数组 var pattern=/^[a-z]+\s[0-9]{4}$/; var str='google 2012'; alert(pattern.exec(str)); //返回一个 ...

  7. php对UTF8字体串进行单字分割返回数组

    在网上查了很多字符串分割方法,都无法正确对UTF8字符串进行正确分割返回单个字符的数组.经过对FTU8编码的分析写出了下面的方法对UTF8进行分割.本人测试可用.本方法只支持UTF8编码的,其它编码转 ...

  8. 【跟着子迟品 underscore】如何优雅地写一个『在数组中寻找指定元素』的方法

    Why underscore (觉得这部分眼熟的可以直接跳到下一段了...) 最近开始看 underscore.js 源码,并将 underscore.js 源码解读 放在了我的 2016 计划中. ...

  9. 让ar执行queryall和queryrow方法返回数组

    让ar执行queryall和queryrow方法返回数组 <?phpnamespace common\components;use \CActiveRecord;use \Yii;use \CD ...

  10. javascript 返回数组中不重复的元素

    这是实现结构伪类type-of-type的部分代码: <script type="text/javascript"> var ret= ["span" ...

随机推荐

  1. Vue3.5新增的baseWatch让watch函数和Vue组件彻底分手

    前言 在Vue 3.5.0-beta.3版本中新增了一个base watch函数,这个函数用法和我们熟知的watch API一模一样.区别就是我们之前用的watch API是和Vue组件以及生命周期是 ...

  2. KNN算法 0基础小白也能懂(附代码)

    KNN算法 0基础小白也能懂(附代码) 原文链接 1.K近邻是啥 1968年,Cover 和 Hart 提出了最初的近邻法,思路是--未知的豆离哪种豆最近,就认为未知豆和该豆是同一种类. 近邻算法的定 ...

  3. 关于java连接数据库时提示异常java.sql.SQLException: No suitable driver found for说明

    当我们测试一个新的数据库服务时,需要使用对方提供jdbc驱动来连接数据库,有时候简单的写个demo去连接,发现提示异常: java.sql.SQLException: No suitable driv ...

  4. office系列软件(word、ppt、excel)打不开的解决方案

    前言 ​ 这里我遇到的情况是点击都没反应,而不像很多人那样有报错弹窗,费劲千辛万苦才最终解决,中间一度自暴自弃想着干脆用WPS得了(大可不必),中间我尝试了三种方法,不一定哪种有效,权当分享: 一.使 ...

  5. Go语言中的交互式CLI开发:survey库简介

    在构建命令行工具时,良好的用户交互体验至关重要.尤其是在需要与用户进行复杂输入的场景下,传统的命令行参数和标志可能显得笨拙.github.com/AlecAivazis/survey/v2 是一个为 ...

  6. ubuntu 20.04安装GCC G++ 6.2,支持c++ 14

    1. 下载源码包 wget http://ftp.gnu.org/gnu/gcc/gcc-6.2.0/gcc-6.2.0.tar.bz2 2. 解压 tar jxf gcc-6.2.0.tar.bz2 ...

  7. frp_v0.37.1内网穿透,内网服务公网用不求人

    前言: 公司内网无法访问,出差又需要用到公司内网进行办公,苦恼了好一阵.这时候想到了内网穿透,这就不得不提到几年前被安利的frp,一看GitHub竟然已经5年了,网上估计大把教程了. 那么什么是frp ...

  8. Angular 18+ 高级教程 – Signals

    前言 首先,我必须先说明清楚.Signal 目前不是 Angular 的必备知识. 你的项目不使用 Signal 也不会少了条腿,断了胳膊. Angular 官方维护的 UI 组件库 Angular ...

  9. DOM – Work with Document.styleSheets and JS/Scss Breakpoint Media Query

    前言 为了方便管理, 我们会定义 CSS Variables, 类似于全局变量. 有时候做特效的时候还需要 JavaScript 配合, 这时就会希望 JavaScript 可以获取到 CSC Var ...

  10. 【Abyss】Android 平台应用级系统调用拦截框架

    Android平台从上到下,无需ROOT/解锁/刷机,应用级拦截框架的最后一环 -- SVC系统调用拦截. ☞ Github ☜ 由于我们虚拟化产品的需求,需要支持在普通的Android手机运行.我们 ...