Golang每日一练(leetDay0097) 顶端迭代器、寻找重复数

news2024/11/25 12:47:04

目录

284. 顶端迭代器 Peeking Iterator  🌟🌟

287. 寻找重复数 Find the Duplicate Number  🌟🌟

🌟 每日一练刷题专栏 🌟

Rust每日一练 专栏

Golang每日一练 专栏

Python每日一练 专栏

C/C++每日一练 专栏

Java每日一练 专栏


284. 顶端迭代器 Peeking Iterator

请你在设计一个迭代器,在集成现有迭代器拥有的 hasNext 和 next 操作的基础上,还额外支持 peek 操作。

实现 PeekingIterator 类:

  • PeekingIterator(Iterator<int> nums) 使用指定整数迭代器 nums 初始化迭代器。
  • int next() 返回数组中的下一个元素,并将指针移动到下个元素处。
  • bool hasNext() 如果数组中存在下一个元素,返回 true ;否则,返回 false 。
  • int peek() 返回数组中的下一个元素,但  移动指针。

注意:每种语言可能有不同的构造函数和迭代器 Iterator,但均支持 int next() 和 boolean hasNext() 函数。

示例 :

输入:
["PeekingIterator", "next", "peek", "next", "next", "hasNext"]
[[[1, 2, 3]], [], [], [], [], []]
输出:
[null, 1, 2, 2, 3, false]

解释:
PeekingIterator peekingIterator = new PeekingIterator([1, 2, 3]); // [1,2,3]
peekingIterator.next();    // 返回 1 ,指针移动到下一个元素 [1,2,3]
peekingIterator.peek();    // 返回 2 ,指针未发生移动 [1,2,3]
peekingIterator.next();    // 返回 2 ,指针移动到下一个元素 [1,2,3]
peekingIterator.next();    // 返回 3 ,指针移动到下一个元素 [1,2,3]
peekingIterator.hasNext(); // 返回 False

提示:

  • 1 <= nums.length <= 1000
  • 1 <= nums[i] <= 1000
  • 对 next 和 peek 的调用均有效
  • nexthasNext 和 peek 最多调用  1000 次

进阶:你将如何拓展你的设计?使之变得通用化,从而适应所有的类型,而不只是整数型?

代码:

package main

import "fmt"

type PeekingIterator struct {
	iter    *Iterator
	hasPeek bool // 是否有 Peek 缓存
	peekVal int  // Peek 缓存值
}

func Constructor(iter *Iterator) *PeekingIterator {
	return &PeekingIterator{iter: iter}
}

func (it *PeekingIterator) hasNext() bool {
	if it.hasPeek {
		return true
	}
	return it.iter.hasNext()
}

func (it *PeekingIterator) next() int {
	if it.hasPeek {
		it.hasPeek = false // 清除 Peek 缓存
		return it.peekVal
	}
	return it.iter.next()
}

func (it *PeekingIterator) peek() int {
	if it.hasPeek {
		return it.peekVal
	}
	it.peekVal = it.iter.next()
	it.hasPeek = true // 更新 Peek 缓存状态
	return it.peekVal
}

type Iterator struct {
	nums []int
	idx  int
}

func (it *Iterator) hasNext() bool {
	return it.idx < len(it.nums)
}

func (it *Iterator) next() int {
	if !it.hasNext() {
		panic("out of index")
	}
	val := it.nums[it.idx]
	it.idx++
	return val
}

func main() {
	nums := []int{1, 2, 3}
	iter := &Iterator{nums: nums}
	pIter := Constructor(iter)
	fmt.Println(pIter.next())    // 1
	fmt.Println(pIter.peek())    // 2
	fmt.Println(pIter.next())    // 2
	fmt.Println(pIter.next())    // 3
	fmt.Println(pIter.hasNext()) // false
}

输出:

1
2
2
3
false


287. 寻找重复数 Find the Duplicate Number

给定一个包含 n + 1 个整数的数组 nums ,其数字都在 [1, n] 范围内(包括 1 和 n),可知至少存在一个重复的整数。

假设 nums 只有 一个重复的整数 ,返回 这个重复的数 。

你设计的解决方案必须 不修改 数组 nums 且只用常量级 O(1) 的额外空间。

示例 1:

输入:nums = [1,3,4,2,2]
输出:2

示例 2:

输入:nums = [3,1,3,4,2]
输出:3

提示:

  • 1 <= n <= 10^5
  • nums.length == n + 1
  • 1 <= nums[i] <= n
  • nums 中 只有一个整数 出现 两次或多次 ,其余整数均只出现 一次

进阶:

  • 如何证明 nums 中至少存在一个重复的数字?
  • 你可以设计一个线性级时间复杂度 O(n) 的解决方案吗?

代码1:二分查找

package main

import "fmt"

func findDuplicate(nums []int) int {
	n := len(nums)
	l, r := 1, n-1
	for l < r {
		mid := (l + r) >> 1
		cnt := 0
		for _, num := range nums {
			if num <= mid {
				cnt++
			}
		}
		if cnt > mid {
			r = mid
		} else {
			l = mid + 1
		}
	}
	return l
}

func main() {
	nums1 := []int{1, 3, 4, 2, 2}
	fmt.Println(findDuplicate(nums1)) // 2

	nums2 := []int{3, 1, 3, 4, 2}
	fmt.Println(findDuplicate(nums2)) // 3
}

代码2:双指针

package main

import "fmt"

func findDuplicate(nums []int) int {
    slow, fast := nums[0], nums[0]
    for {
        slow = nums[slow]
        fast = nums[nums[fast]]
        if slow == fast {
            break
        }
    }
    slow = nums[0]
    for slow != fast {
        slow = nums[slow]
        fast = nums[fast]
    }
    return slow
}

func main() {
	nums1 := []int{1, 3, 4, 2, 2}
	fmt.Println(findDuplicate(nums1)) // 2

	nums2 := []int{3, 1, 3, 4, 2}
	fmt.Println(findDuplicate(nums2)) // 3
}

 代码2:桶排序法

package main

import "fmt"

func findDuplicate(nums []int) int {
    n := len(nums)
    buckets := make([]int, n)
    for _, num := range nums {
        if buckets[num-1] > 0 {
            return num
        }
        buckets[num-1]++
    }
    return -1
}

func main() {
	nums1 := []int{1, 3, 4, 2, 2}
	fmt.Println(findDuplicate(nums1)) // 2

	nums2 := []int{3, 1, 3, 4, 2}
	fmt.Println(findDuplicate(nums2)) // 3
}

输出:

2
3


🌟 每日一练刷题专栏 🌟

持续,努力奋斗做强刷题搬运工!

👍 点赞,你的认可是我坚持的动力! 

🌟 收藏,你的青睐是我努力的方向! 

评论,你的意见是我进步的财富!  

 主页:https://hannyang.blog.csdn.net/ 

Rust每日一练 专栏

(2023.5.16~)更新中...

Golang每日一练 专栏

(2023.3.11~)更新中...

Python每日一练 专栏

(2023.2.18~2023.5.18)暂停更

C/C++每日一练 专栏

(2023.2.18~2023.5.18)暂停更

Java每日一练 专栏

(2023.3.11~2023.5.18)暂停更

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/648036.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

应聘求职自荐信优秀范文5篇

应聘求职自荐信优秀范文篇1 尊敬的领导&#xff1a; 您好!衷心的感谢您在百忙之中翻阅我的这份材料&#xff0c;并祝愿贵单位事业欣欣向荣&#xff0c;蒸蒸日上! 我是哈尔滨理工大学测控技术及通信工程学院________届毕业生&#xff0c;自从今日大学之后&#xff0c;高考后的轻…

【MySQL数据库 | 第十八篇】索引分类与语法

前言&#xff1a; 在上一篇我们讲解了什么是索引以及索引的结构&#xff0c;这一篇我们将更进一步的讲解索引的分类以及语法介绍&#xff0c;大家准备好了嘛&#xff1f; 索引分类&#xff1a; 1. 主键索引 主键索引是一种特殊的唯一索引&#xff0c;它强制保证某列的值…

chatgpt赋能python:Python-查看已安装的库

Python - 查看已安装的库 Python 作为一种流行的编程语言&#xff0c;具有丰富的标准库和大量的第三方库&#xff0c;这些库可以方便地进行开发&#xff0c;缩短开发周期并提高代码质量。但是&#xff0c;随着时间的推移和项目累积&#xff0c;我们可能会忘记在当前机器上已经…

【瑞萨RA_FSP】电位器电压采集

文章目录 一、硬件设计二、软件设计1. 文件结构2. FSP配置3. ADC初始化函数4. ADC中断回调函数5. 如果未启用中断6. ADC读取转换结果函数7. hal_entry入口函数 一、硬件设计 野火启明6M5开发板的 ADC 电位器电路图如图所示。 可知&#xff0c;开发板板载的电位器连接到 P000 …

随机森林特征重要性(Variable importance)评估方法

Random Forest Variable importance 算法介绍实现算法流程分类回归 实验实验1&#xff1a;waveform数据集&#xff08;分类&#xff09;实验2&#xff1a;superconductivity数据集&#xff08;回归&#xff09;实验3&#xff1a;power-consumption数据集&#xff08;回归&#…

UNIX环境高级编程——进程间通信

15.1 引言 本章将说明进程之间相互通信技术——进程间通信&#xff08;InterProcess Communication&#xff0c;IPC&#xff09;。 IPC类型包括&#xff1a; 前10种IPC形式通常限于同一台主机的两个进程之间的IPC&#xff1b;最后2种是仅有的支持不同主机上两个进程之间的I…

5G NR SRS功率控制

3GPP TS 38.213 7.3.1节中&#xff0c;关于SRS的功率控制算法如下&#xff1a; 其中&#xff0c; : 表示在载波f服务小区c以及SRS的发送时隙i UE被配置的最大发射功率&#xff1b; : 表示在载波f&#xff0c;BWP b, 服务小区c&#xff0c;SRS资源集qs所配置的p0值&#xff1…

【GateWay快速入门】 —— 每天一点小知识

&#x1f4a7; Z o o K e e p e r 快速入门 \color{#FF1493}{ZooKeeper快速入门} ZooKeeper快速入门&#x1f4a7; &#x1f337; 仰望天空&#xff0c;妳我亦是行人.✨ &#x1f984; 个人主页——微风撞见云的博客&#x1f390; &#x1f433; 《数据结构与算法》专…

子线程不显示Toast?

Handler不仅在ANR过程中有用到&#xff0c;Toast中也用到了Handler。 代码如下&#xff1a; public class MainActivity extends AppCompatActivity {Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.lay…

chatgpt赋能python:Python如何进行高效的查询?

Python如何进行高效的查询&#xff1f; 在Python中&#xff0c;查询是一项非常常见的操作&#xff0c;而高效的查询在数据量增大时可以显著提高程序的性能和效率。本文将介绍Python中的查询方式以及如何进行高效的查询操作。 Python中的查询方式 Python中查询的方式主要分为…

嵌入式容器源码解析

问题分析 不同于使用springmvc,在我们使用springboot时无需配置tomcat就可以直接使用&#xff0c;这就说明springboot已经在我们启动项目时将tomcat配置好了&#xff0c;接下来我们就来看看springboot底层是怎么实现的。 源码解析 ServletWebServerFactoryAutoConfiguratio…

基于Java乡镇自来水收费系统设计实现(源码+lw+部署文档+讲解等)

博主介绍&#xff1a; ✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战 ✌ &#x1f345; 文末获取源码联系 &#x1f345; &#x1f447;&#x1f3fb; 精…

chatgpt赋能python:如何使用Python查看当前路径

如何使用Python查看当前路径 作为一名有10年Python编程经验的工程师&#xff0c;我今天想和大家分享如何使用Python来查看当前路径。这在开发过程中非常有用&#xff0c;尤其是当需要导入文件或访问某个文件夹时。在本文中&#xff0c;我将介绍在Windows、Mac和Linux系统上如何…

深蓝学院C++基础与深度解析笔记 第 3 章 数组、 vector 与字符串

第 3 章 数组、 vector 与字符串 一、数组 将一到多个相同类型的对象串连到一起&#xff0c;所组成的类型 int a → int b[10] b的类型是int[10]; A、 数组的初始化方式&#xff1a; ● 缺省初始化 ● 聚合初始化&#xff08; aggregate initialization &#xff09; int b[3…

ansible的部署和命令模块和playbooks剧本

系列文章目录 文章目录 系列文章目录一、Ansible1、Ansible简介2、Ansible特点及优势3、Ansible核心程序4、Ansible工作原理及流程5.部署Ansible自动化运维工具6、Ansible常用模块 二、playbooks剧本1.playbooks2、playbooks组成部分3、playbooks启动及检测 总结 一、Ansible …

简单的TCP网络程序·多进程、多线程(后端服务器)

前文链接 -- 简单的TCP网络程序单进程 上篇文章中&#xff0c;实现了TCP网络通信的的单进程版本&#xff0c;因为实现的是一个死循环的逻辑&#xff0c;是串行实运行的&#xff0c;显然这和实际中的TCP通信是不同的&#xff0c;为了解决这方面的问题&#xff0c;需要使用多进程…

B+树:MySQL数据库索引的实现

作为一个软件开发工程师&#xff0c;你对数据库肯定再熟悉不过了。作为主流的数据存储系统&#xff0c;它在我们的业务开发中&#xff0c;有着举足轻重的地位。在工作中&#xff0c;为了加速数据库中数据的查找速度&#xff0c;我们常用的处理思路是&#xff0c;对表中数据创建…

chatgpt赋能python:Python怎么横着输出?

Python怎么横着输出&#xff1f; 如果你是一名有10年Python编程经验的工程师&#xff0c;你一定已经经历过许多项目&#xff0c;很可能你曾经需要对代码进行一些横向格式化或输出。Python作为一种高级编程语言&#xff0c;有各种各样的技巧和技能。在本文中&#xff0c;我们将…

node安装后的全局环境变量配置

安装node时&#xff0c;位置最好不要装在c盘&#xff0c;这里&#xff0c;我在D盘下创建了文件夹"node"&#xff0c;安装地址选择在该文件夹下 一直next&#xff0c;直到安装结束&#xff0c;打开"node"文件夹&#xff0c;安装完后&#xff0c;里面的配置…

C++【STL】之vector的使用

文章目录&#xff1a; vector介绍vector使用1. 默认成员函数1.1 默认构造1.2 拷贝构造1.3 析构函数1.4 赋值重载 2. 迭代器2.1 正向迭代器2.2 反向迭代器 3. 容量操作3.1 获取空间数据3.2 空间扩容3.3 大小调整3.4 空间缩容 4. 数据访问4.1 下标随机访问4.2 获取首尾元素 5. 数…