力扣刷题Day3

2024-05-06 14:04
文章标签 力扣 day3 刷题

本文主要是介绍力扣刷题Day3,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目:

反转字符串:

344. 反转字符串 - 力扣(LeetCode)

思路:

反转字符串,这个反转其实和之前的反转链表差不多,之前的是用两个指针来进行转换的,这个其实也可以用两个指针来反转,而且更简单了,对于c++来说其实可以用库函数来实现反转,但是需要知道其函数的原理才最好。

两个指针先放在一左一右,进行交换,然后指针往里移动,直到两个指针重合即可。

代码:

void reverseString(char* s, int sSize) {int left=0;int right=sSize-1;while(left<right){char temp = s[left];s[left++] = s[right];s[right--] = temp;}
}

void reverseString(char* s, int sSize)
{int l = 0;int r = sSize- 1;while (l < r) {s[l] ^= s[r];  //构造 a ^ b 的结果,并放在 a 中s[r] ^= s[l];  //将 a ^ b 这一结果再 ^ b ,存入b中,此时 b = a, a = a ^ bs[l] ^= s[r];  //a ^ b 的结果再 ^ a ,存入 a 中,此时 b = a, a = b 完成交换l++;r--;}
}

总结:

1. swap函数可以通过两种方式实现:

        1)地址交换

        2)位运算来实现交换

这里细讲一下位运算的交换:由于^符号是代表异或:也就是当两边的变量相同时取0,不同时取1,当a^a时=0,而a^0时这里可以列一个真值表来体现一下:当a=1,取1,当a=0,相同取0,所以这里推导出来了两个式子:

a^a=0

a^0=a

那接着看如何把两个变量给交换了呢?

a=a^a^b=(a^a)^b=0^b=b;

b=b^b^a=(b^b)^a=0^a=a;

这两个式子一结合起来,是不是就可以实现交换了呢?

那实际上的代码怎么写呢?——

a=a^b;

b=a^b;

a=a^b;

把上面的两个式子拆分为三个式子,先把a给表示成为a^b,再带入b=a^b,这样最后就可以实现交换了

三个式子分别的含义如下:

构造 a ^ b 的结果,并放在 a 中
将 a ^ b 这一结果再 ^ b ,存入b中,此时 b = a, a = a ^ b
a ^ b 的结果再 ^ a ,存入 a 中,此时 b = a, a = b 完成交换

2.c++库函数实现字符串的反转

reverse()函数直接调用即可

3. 注意数组溢出的问题:

对于这道题,它题目中明确要求不要另外开辟空间,如果不使用指针来完成这道题的话,有些人可能会在数组的后面先存储前面下标的元素,但是如果真这样做,力扣一定会报错,因为忽略了一个重要的问题,数组的大小是和字符串的长度一样,没有多余出来的空间,所以这道题不可以这样做。

这篇关于力扣刷题Day3的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/964559

相关文章

力扣SQL50 每位经理的下属员工数量 join

Problem: 1731. 每位经理的下属员工数量 👨‍🏫 参考题解 Code select m.Employee_id, m.name,count(*) reports_count,round(avg(e.age),0) average_agefrom Employees ejoin Employees mon e.reports_to = m.Employee_id

刷题——比较版本号

比较版本号_牛客题霸_牛客网 int compare(string version1, string version2){int len1 = version1.size();int len2 = version2.size();int i=0,j=0;while(i<len1 || j <len2){long num1 =0 ;while(i <len1 && version1.charAt

leetcode刷题(46)——236. 二叉树的最近公共祖先

这道题比235略难一些 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。” 例如,给定如下二叉树: root = [3,5,1,6,2,0,8,null,null,7,4] 示例 1: 输入:

leetcode刷题(45)——35. 二叉搜索树的最近公共祖先

给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。” 例如,给定如下二叉搜索树: root = [6,2,8,0,4,7,9,null,null,3,5] 示例 1: 输入: root = [

leetcode刷题(44)——242. 有效的字母异位词

给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。 示例 1: 输入: s = “anagram”, t = “nagaram” 输出: true 示例 2: 输入: s = “rat”, t = “car” 输出: false 说明: 你可以假设字符串只包含小写字母。 进阶: 如果输入字符串包含 unicode 字符怎么办?你能否调整你的解法来应对这种情况?

leetcode刷题(43)——239. 滑动窗口最大值

给定一个数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 返回滑动窗口中的最大值。 示例: 输入: nums = [1,3,-1,-3,5,3,6,7], 和 k = 3输出: [3,3,5,5,6,7] 解释: 滑动窗口的位置 最大值------------

leetcode刷题(42)——703. 数据流中的第K大元素

设计一个找到数据流中第K大元素的类(class)。注意是排序后的第K大元素,不是第K个不同的元素。 你的 KthLargest 类需要一个同时接收整数 k 和整数数组nums 的构造器,它包含数据流中的初始元素。每次调用 KthLargest.add,返回当前数据流中第K大的元素。 示例: int k = 3;int[] arr = [4,5,8,2];KthLargest kthLar

leetcode刷题(41)——232. 用栈实现队列

使用栈实现队列的下列操作: push(x) – 将一个元素放入队列的尾部。 pop() – 从队列首部移除元素。 peek() – 返回队列首部的元素。 empty() – 返回队列是否为空。 示例: MyQueue queue = new MyQueue();queue.push(1);queue.push(2); queue.peek(); // 返回 1queue.pop();

leetcode刷题(40)——83. 删除排序链表中的重复元素

给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次。 示例 1: 输入: 1->1->2 输出: 1->2 示例 2: 输入: 1->1->2->3->3 输出: 1->2->3 平时我们删除一个链表中的某个元素,一般都是以下的写法: temp.next = temp.next.next; 这样temp.next就被删除了 此题解法如下: class Solution

leetcode刷题(39)——反转链表 II

这道题可以说是非常难的,2中解法,迭代和递归,递归更加难想出来 解法1:迭代链接反转 算法 在看具体算法之前,有必要先弄清楚链接反转的原理以及需要哪些指针。举例而言,有一个三个不同结点组成的链表 A → B → C,需要反转结点中的链接成为 A ← B ← C。 假设我们有两个指针,一个指向结点 A,一个指向结点 B。 分别记为 prev 和 cur。则可以用这两个指针简单地实现 A 和 B