代码随想录第八天|反转字符串、双指针

news/2024/10/30 19:36:08/

代码随想录第八天

    • Leetcode 344 反转字符串
    • Leetcode 541 反转字符串 II
    • Leetcode 剑指 Offer 05. 替换空格
    • Leetcode 151. 反转字符串中的单词
    • Leetcode 剑指 Offer 58 - II. 左旋转字符串

Leetcode 344 反转字符串

题目链接: 反转字符串
自己的思路:要交换第一个元素和最后一个元素,交换第二个元素和倒数第二个元素。。。,可以分析出是两个指针移动的过程,所以我们想到用双指针法来处理,定义左右两个指针,分别交换两个指针的元素,移动指针,一直到两个指针相等为止。

正确思路:双指针

代码:

class Solution {public void reverseString(char[] s) {//定义左右两个指针int left = 0;int right = s.length-1;while(left<right){//交换两个指针对应的元素char temp = s[left];s[left] = s[right];s[right] = temp;//移动两个指针left++;right--;}}
}

复杂度分析
时间复杂度: O ( n ) \mathcal{O}(n) O(n)
空间复杂度: O ( 1 ) \mathcal{O}(1) O(1)

Leetcode 541 反转字符串 II

题目链接: 反转字符串 II
自己的思路:自己没想到

正确思路:首先将字符串转换为数组,方便进行操作,每次让i移动2k个单位(这非常重要),移动之后使用双指针反转前k个元素,如果剩余元素不足k个,那么反转剩余元素,所以要对chars.length-1和i+k-1的大小进行判断,取最小值,因为可能剩余元素不足k个,最后返回新的字符串即可。

代码:

class Solution {public String reverseStr(String s, int k) {//先将字符串转换为数组,方便操作char[] chars= s.toCharArray();//i每次移动2k个单位for (int i =0;i<chars.length;i+=2*k){int start = i;//判断是否还剩下k个元素,int end = Math.min(chars.length-1,i+k-1);//反转前k个元素或者反转剩余元素while(start<end){char temp = chars[start];chars[start] = chars[end];chars[end] = temp;start++;end--;}}//返回新字符串return new String(chars);}
}

复杂度分析
时间复杂度: O ( n ) \mathcal{O}(n) O(n)
空间复杂度: O ( n ) \mathcal{O}(n) O(n)

Leetcode 剑指 Offer 05. 替换空格

题目链接: 替换空格
自己的思路:在替换完以后数组一定会扩大,由于java的字符串不可变,所以不能在原有的字符串的基础上进行扩容,我们选择新建一个字符串来存放替换之后的字符,使用双指针来完成赋值操作,一个指针index1指向原先字符串的尾部,另一个指针index2指向新字符串的尾部,如果index1指向非空格字符,则直接赋值给index2的位置,否则依次给index2的指针赋值’0’,‘2’,‘%’,直到index指向非0为止。

正确思路:扩容+双指针

代码:

class Solution {public String replaceSpace(String s) {//最初s的长度int length = s.length();//记录空格的数量int count = 0;for (int i =0;i<length;i++){if (s.charAt(i)==' '){count++;}}//新建一个数组存储最后的字符数组char[] chars = new char[length+count*2];//定义两个指针用于存储新数组的元素int index1 = length - 1;int index2 = chars.length-1;while(index1>=0){//如果不是空格的话直接赋值给chars即可if (s.charAt(index1)!=' '){chars[index2] = s.charAt(index1);index1--;index2--;}else{//如果是空格的话,则依次给chars赋值chars[index2] = '0';index2--;chars[index2] = '2';index2--;chars[index2] = '%';index2--;index1--;}}//返回最后的字符串return new String(chars);}
}

复杂度分析
时间复杂度: O ( n ) \mathcal{O}(n) O(n)
空间复杂度: O ( n ) \mathcal{O}(n) O(n)

Leetcode 151. 反转字符串中的单词

题目链接: 反转字符串中的单词
自己的思路:没想出来

正确思路:双指针法+新建字符串;使用双指针进行处理,左右双指针,先使用双指针去除左右两边的空格,然后移动右边的指针,当碰到第一个为空格的字符时,说明已经遍历了一个单词,则将这个单词放置在新的字符串中,再加入一个空格,继续遍历,直到遍历完整个字符串。

代码:

class Solution {public String reverseWords(String s) {//定义两个指针int left = 0;int right = s.length()-1;//新建一个可变的字符串StringBuilder sb = new StringBuilder();//除去左右两边空格while(s.charAt(left)==' ')left++;while(s.charAt(right)==' ')right--;while(left<=right){int index = right;while(index>=left&&s.charAt(index)!=' ') index--;//将单词赋值给新的字符串for (int i = index+1;i<=right;i++){sb.append(s.charAt(i));}//如果没有把所有单词加进去,则加个空格if (index>left) sb.append(' ');while(index>=left&&s.charAt(index)==' ') index--;right = index;}return sb.toString();}
}

复杂度分析
时间复杂度: O ( n ) \mathcal{O}(n) O(n)
空间复杂度: O ( n ) \mathcal{O}(n) O(n)

Leetcode 剑指 Offer 58 - II. 左旋转字符串

题目链接: 左旋转字符串
自己的思路:拼接截取;先将原来字符串加上原来字符串,然后从n到n+length进行截取即可

正确思路:

代码:

class Solution {public String reverseLeftWords(String s, int n) {int length = s.length();//将原来字符串复制一份进行拼接String res = s + s;//直接截取res = res.substring(n,n+length);return res;}
}

复杂度分析
时间复杂度: O ( 1 ) \mathcal{O}(1) O(1)
空间复杂度: O ( n ) \mathcal{O}(n) O(n)


http://www.ppmy.cn/news/742004.html

相关文章

【三】当输入表是输出表从表时,两表主键不一致,如何使用kettle同步

如果对于基本操作不太了解的可以去看我的第一篇推文 【一】kettle使用表输入&#xff0c;表输出控件入门小demo 目录 一、表结构1、输入表结构2、输出表结构 二、需求描述三、kettle表输入1、sql内容2、配置详情 四、kettle表输出五、进行节点连接 一、表结构 1、输入表结构 2…

电脑换IP后,改虚拟机里的IP

虚拟网关配置好&#xff0c;改成和你电脑一样的网段 cd /etc vim hosts 改成你想要的 cd /etc/sysconfig/network-scripts vim ifcfg-en... 改成你想要的 cd /etc/sysconfig/ vim network 改成你想要的

在线绘制函数图像和在线图标绘制网址

经过寻找&#xff0c;找到了几个在线绘制函数图像的网址&#xff0c;可以不用matlab和geogebra软件绘制了。 数学函数图像&#xff1a; 第一个&#xff1a;Desmos 首推 第二个&#xff1a;fooplot 可以绘制分段函数比如&#xff1a; (x>1)x*3/(3*x1) (x<1)x*3/4 …

python 画隐函数图像 画三维显函数图像

import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D import numpy as np#隐函数画法1 xrange np.linspace(-2 ,2, 400) yrange np.linspace(-2, 2, 400)X, Y np.meshgrid(xrange,yrange) R Y**2 X**2 plt.contour(X,Y,R,[1]) plt.show()##########…

用python画函数图像

画sigmoid激活函数&#xff1a; import numpy as np import matplotlib.pylab as pltdef sigmoid(x):return 1/(1np.exp(-x)) # sigmoid函数x np.arange(-6.0,6.0,0.1) # 限定x的范围&#xff0c;给什么区间画出来的就是在哪个区间 y sigmoid(x) # 求y值plt.plot(x,y) pl…

Opencv-python 求原坐标点透视变换后对应坐标点

1.关于透视变换原理不赘述 2.已知原图img一像素点坐标p(x,y)&#xff0c;变换前矩阵坐标pts1&#xff0c;变换后矩阵坐标pts2&#xff0c;求变换后p点对应坐标 3.程序 # p pts1 pts2#求变换矩阵M M cv2.getPerspectiveTransform(pts1, pts2)# 坐标转换 def cvt_pos(pos, …

python画对数与半对数坐标

import numpy as np import matplotlib.pyplot as plt import scipy.stats as stsif __name__ __main__:a 0.031 / 10000 0.0337 / 10000print(0.0336 * 100 / np.sqrt(a)) # 1320.95r sts.lognorm.rvs(0.954, size1000)c plt.hist(r, bins500)plt.show()# 双对数坐标下f…

项目二:绘制数学函数图像

在Python中&#xff0c;绘制函数图像一般要用到Numpy和 Matplotlib两个模块&#xff0c;这两个模块需要另外安装。 numpy模块&#xff1a; 是一个科学计算包&#xff0c;其中包括很多数学函数&#xff0c;如三角函数、矩阵计算方法、矢量运算、线性代数等。 通过该模块中的ar…