Fork me on GitHub

Leetcode-026-删除有序数组中的重复元素

Leetcode-026-删除有序数组中的重复项

题目描述

  • 给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。
  • 不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。

说明:

为什么返回数值是整数,但输出的答案是数组呢?

请注意,输入数组是以「引用」方式传递的,这意味着在函数里修改输入数组对于调用者是可见的。

你可以想象内部操作如下:

1
2
3
4
5
6
7
8
// nums 是以“引用”方式传递的。也就是说,不对实参做任何拷贝
int len = removeDuplicates(nums);

// 在函数里修改输入数组对于调用者是可见的。
// 根据你的函数返回的长度, 它会打印出数组中 该长度范围内 的所有元素。
for (int i = 0; i < len; i++) {
print(nums[i]);
}
1
2
3
4
5
6
7
8
9
10
11
示例 1:

输入:nums = [1,1,2]
输出:2, nums = [1,2]
解释:函数应该返回新的长度 2 ,并且原数组 nums 的前两个元素被修改为 1, 2 。不需要考虑数组中超出新长度后面的元素。

示例 2:

输入:nums = [0,0,1,1,1,2,2,3,3,4]
输出:5, nums = [0,1,2,3,4]
解释:函数应该返回新的长度 5 , 并且原数组 nums 的前五个元素被修改为 0, 1, 2, 3, 4 。不需要考虑数组中超出新长度后面的元素。

方法一 : 双指针

  • 数组完成排序后,我们可以放置两个指针 i 和 j,其中 i 是慢指针,而 j 是快指针。只要 nums[i] == nums[j],我们就增加 j 以跳过重复项。
    • 其中慢指针表示处理出的数组的长度,快指针表示已经检查过的数组的长度
  • 当我们遇到nums[i] != nums[j] 时,跳过重复项的运行已经结束,
    • i++ 并且将 nums[i] = nums[j]
    • 作用:为了覆盖重复的元素
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class Solution {
public int removeDuplicates(int[] nums) {
// 1. 初始化及特判
int len = nums.length;
if(len < 0){
return 0;
}
int i = 0; // i慢指针

// 2. 双指针逻辑
for(int j = 1;j < len;j++){ // j快指针
// 2.1 如果nums[j] != nums[i]
if(nums[j] != nums[i]){
i++;
nums[i] = nums[j]; // i++ 并将重复元素直接覆盖
} // 否则如果 nums[j] == nums[i] 直接外层for循环跳到下一个j
}

// 3. 返回慢指针长度
return i + 1;
}
}

复杂度分析

  • 时间复杂度:O(n) ,遍历一遍数组
  • 空间复杂度:O(1) , 原地修改

RabbitMQ-08-SpringBoot整合使用

RabbitMQ-08-SpringBoot整合使用

1. 使用场景概述

  • rabbitMQ的作用 : 解耦 削峰 异步

1.1 同步异步的问题(串行)

  • 串行方式:将订单信息写入数据库成功后,发送注册邮件,再发送注册短信。以上三个任务全部完成后,返回给客户端

mark

代码示例

1
2
3
4
5
6
7
8
9
10
public void makeOrder(){
// 1 :保存订单
orderService.saveOrder();
// 2: 发送短信服务
messageService.sendSMS("order");//1-2 s
// 3: 发送email服务
emailService.sendEmail("order");//1-2 s
// 4: 发送APP服务
appService.sendApp("order");
}
阅读更多...

Leetcode-1143-最长公共子序列

Leetcode-1143-最长公共子序列

题目描述

  • 给定两个字符串 text1text2,返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 ,返回 0
  • 一个字符串的 子序列 是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符(也可以不删除任何字符)后组成的新字符串。
    • 例如,"ace""abcde" 的子序列,但 "aec" 不是 "abcde" 的子序列。
    • 两个字符串的 公共子序列 是这两个字符串所共同拥有的子序列。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
示例 1:

输入:text1 = "abcde", text2 = "ace"
输出:3

解释:最长公共子序列是 "ace" ,它的长度为 3 。
示例 2:

输入:text1 = "abc", text2 = "abc"
输出:3
解释:最长公共子序列是 "abc" ,它的长度为 3 。

示例 3:

输入:text1 = "abc", text2 = "def"
输出:0
解释:两个字符串没有公共子序列,返回 0 。
  • 提示:
    • 1 <= text1.length, text2.length <= 1000
    • text1text2 仅由小写英文字符组成。
阅读更多...

Leetcode-面试题17.21-直方图的水量

Leetcode-面试题17.21-直方图的水量

题目描述

  • 给定一个直方图(也称柱状图),假设有人从上面源源不断地倒水,最后直方图能存多少水量?直方图的宽度为 1。

mark

  • 上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1]表示的直方图,在这种情况下,可以接 6 个单位的水(蓝色部分表示水)。

示例:

1
2
输入: [0,1,0,2,1,0,1,3,2,1,2,1]
输出: 6
阅读更多...

Leetcode-1006-笨阶乘

Leetcode-1006-笨阶乘

题目描述

  • 通常,正整数 n 的阶乘是所有小于或等于 n 的正整数的乘积。例如,factorial(10) = 10 * 9 * 8 * 7 * 6 * 5 * 4 * 3 * 2 * 1。

  • 相反,我们设计了一个笨阶乘clumsy:在整数的递减序列中,我们以一个固定顺序的操作符序列来依次替换原有的乘法操作符:乘法(*),除法(/),加法(+)和减法(-)。

    例如,clumsy(10) = 10 * 9 / 8 + 7 - 6 * 5 / 4 + 3 - 2 * 1。然而,这些运算仍然使用通常的算术运算顺序:我们在任何加、减步骤之前执行所有的乘法和除法步骤,并且按从左到右处理乘法和除法步骤。

  • 另外,我们使用的除法是地板除法(floor division),所以 10 * 9 / 8等于 11。这保证结果是一个整数。

    实现上面定义的笨函数:给定一个整数 N,它返回 N 的笨阶乘。

1
2
3
4
5
6
7
8
9
10
示例 1:

输入:4
输出:7
解释:7 = 4 * 3 / 2 + 1
示例 2:

输入:10
输出:12
解释:12 = 10 * 9 / 8 + 7 - 6 * 5 / 4 + 3 - 2 * 1

提示:

  1. 1 <= N <= 10000
  2. -2^31 <= answer <= 2^31 - 1 (答案保证符合 32 位整数。)
阅读更多...

Leetcode-074-搜索二维矩阵

Leetcode-074-搜索二维矩阵

题目描述

  • 编写一个高效的算法来判断 m x n矩阵中,是否存在一个目标值。该矩阵具有如下特性:

    • 每行中的整数从左到右按升序排列。
    • 每行的第一个整数大于前一行的最后一个整数。

mark

1
2
输入:matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 3
输出:true

mark

1
2
输入:matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 13
输出:false

提示:

1
2
3
4
m == matrix.length
n == matrix[i].length
1 <= m, n <= 100
-10^4 <= matrix[i][j], target <= 10^4
阅读更多...

计算机组成原理-04-数据的表示

计算机组成原理-04-数据的表示

前言

  • 本篇内容多涉及计算,内容较为硬核,请耐心观看

mark

1. 定点数和浮点数的区别

  • 根据小数点的位置是否固定,在计算机内有两种数据格式

    • 定点数
    • 浮点数
  • 定点表示:约定机器数中的小数点位置固定不变,小数点不再用“,”表示,而是约定了它的位置

2. 无符号数和有符号数

  • 无符号数:指整个机器字长的全部二进制位均为数值位,没有符号位。若机器字长为8位,则数的表示范围 0~2^8-1 , 即0~255
    • 无符号数一般只代表整数,不代表小数
  • 有符号数:在机器中,数的正负我们无法识别,但是我们可以用二进制数来代替正负号。一般‘0’为正,‘1’为负,符号位一般在有效数的最前面。若机器字长为8位,是有符号数,则数的表示范围为 -2^72^7-1 ,即-128127。
阅读更多...

RabbitMQ-06-核心组成部分

RabbitMQ-06-核心组成部分

1. 核心组成概览

mark

核心概念:

  • Server:又称Broker ,接受客户端的连接,实现AMQP实体服务。 安装rabbitmq-server
  • Connection:连接,应用程序与Broker的网络连接 TCP/IP/ 三次握手和四次挥手
  • Channel:网络信道,几乎所有的操作都在Channel中进行,Channel是进行消息读写的通道,客户端可以建立对各Channel,每个Channel代表一个会话任务。
  • Message :消息:服务与应用程序之间传送的数据,由Properties和body组成,Properties可是对消息进行修饰,比如消息的优先级,延迟等高级特性,Body则就是消息体的内容。
  • Virtual Host 虚拟地址,用于进行逻辑隔离,最上层的消息路由,一个虚拟主机可以有若干个Exhange和Queue,同一个虚拟主机里面不能有相同名字的Exchange
  • Exchange:交换机,接受消息,根据路由键发送消息到绑定的队列。(==不具备消息存储的能力==)
  • Bindings:Exchange和Queue之间的虚拟连接,binding中可以保护多个routing key.
  • Routing key:是一个路由规则,虚拟机可以用它来确定如何路由一个特定消息。
  • Queue:队列:也成为Message Queue,消息队列,保存消息并将它们转发给消费者。

mark

阅读更多...
  • © 2019-2022 Zhuuu
  • PV: UV:

请我喝杯咖啡吧~

支付宝
微信