字符串
不要纠结,干就完事了,熟练度很重要!!!多练习,多总结!!!
LeetCode344:反转字符串
编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 char[] 的形式给出。
不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。
示例 1:
输入:[“h”,“e”,“l”,“l”,“o”]
输出:[“o”,“l”,“l”,“e”,“h”]
解题思路
之前讲过一个旋转数组的题目,思想是一样的!双指针!不要迟疑!
双指针分别初始化在字符串数组的两端,然后每次交换后再向中间移动,直至两指针相遇交换结束!
代码实现
class Solution {
public void reverseString(char[] s) {
int i=0,j=s.length-1;
while (i<j){
char tmp=s[i];
s[i++]=s[j];
s[j--]=tmp;
}
}
}
LeetCode796:旋转字符串
给定两个字符串, A 和 B。A 的旋转操作就是将 A 最左边的字符移动到最右边。例如, 若 A = ‘abcde’,在移动一次之后结果就是’bcdea’ 。如果在若干次旋转操作之后,A 能变成B,那么返回True。
示例 1:
输入: A = ‘abcde’, B = ‘cdeab’
输出: true
解题思路
按照题目意思来呗。题意是字符串A若干次旋转后看能否和B相等,那么我们就将字符串A进行若干次旋转,旋转方法等价于用substring函数进行头尾拼接(即每次把A的尾部一个字符,拼接到头部),然后每次拼接后用equals和B判断是否相等即可!
代码实现
class Solution {
public boolean rotateString(String A, String B) {
if (A.equals("")&&B.equals("")){
return true;
}
for (int i=1;i<A.length();i++){
String tmp=A.substring(i,A.length())+A.substring(0,i);
if (tmp.equals(B)){
return true;
}
}
return false;
}
}
LeetCode14:最长公共前缀
编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀,则返回""
示例 1:
输入: [“flower”,“flow”,“flight”]
输出: “fl”
解题思路
既然是公共前缀,那么数组中随便取一个元素进行匹配就行,假设就去第一个,那么我们每次都那第一个元素去和数组其余元素进行匹配(匹配方法是index of),看第一个元素是否是公共前缀,如果有不满足的那么ok,我对第一个字符进行截短(截短即每次去除尾部一个字符用substring实现),看第一个元素截短到什么长度时,可以和数组其余全部元素匹配成功!如果最后第一个元素都缩减为“”也就是空,那么就是没有公共前缀,返回“”即可!
代码实现
class Solution {
public String longestCommonPrefix(String[] strs) {
if (strs.length<1){
return "";
}
String prefix=strs[0];
for (int i=1;i<strs.length;i++){
while (strs[i].indexOf(prefix,0)!=0){
if (prefix.length()==0){
return "";
}
prefix=prefix.substring(0,prefix.length()-1);
}
}
return prefix;
}
}
LeetCode125:验证回文串
给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。
示例 1:
输入: “A man, a plan, a canal: Panama”
输出: true
解题思路
回文串就是对称结构,正着看反着看都一样!我提到了对称结构,那么怎么判断?当然双指针了!但是需要有些预处理,一个是将字符串的大小写统一为小写字母,另外要跳过一个标点符号!之后初始化两个指针分别在字符串的两端,每次需要跳过标点符号指向字符然后判断是否相等,遇到不相等直接返回false,到两指针相遇时,可以返回true!
代码实现
class Solution {
public boolean isPalindrome(String s) {
s=s.toLowerCase();
char[] ch=s.toCharArray();
int i=0,j=ch.length-1;
while (i<j){
if (!((ch[i]>='0'&&ch[i]<='9')||(ch[i]>='a'&&ch[i]<='z'))){
i++;
continue;
}
if (!((ch[j]>='0'&&ch[j]<='9')||(ch[j]>='a'&&ch[j]<='z'))){
j--;
continue;
}
if (ch[i]!=ch[j]){
return false;
}
i++;
j--;
}
return true;
}
}
剑指offer17:打印从1到最大的n位数
输入数字 n,按顺序打印出从 1 到最大的 n 位十进制数。比如输入 3,则打印出 1、2、3 一直到最大的 3 位数 999。
解题思路
n位的最大数字可以借助pow函数来得出,但是如果禁止使用呢?我们用一个for循环一样可以得出,即l=10*l+9,就是9,99,999…,是不是很简单!然后求出最大数字了,数组大小也就确定了,直接for循环对数组赋值就行!
代码实现
class Solution {
public int[] printNumbers(int n) {
int l=0;
for (int i=1;i<=n;i++){
l=l*10+9;
}
int[] res=new int[l];
for (int j=1;j<=l;j++){
res[j-1]=j;
}
return res;
}
}
LeetCode58:最后一个单词的长度
给定一个仅包含大小写字母和空格 ’ ’ 的字符串 s,返回其最后一个单词的长度。如果字符串从左向右滚动显示,那么最后一个单词就是最后出现的单词。
解题思路
最后一个!那么我们可以将字符串进行倒序遍历,来统计最后一个单词的长度。这里有一个坑!那就是最后一个字符可能为“ ”,那么我们需要跳过最后一个空格再开始计数!
代码实现
class Solution {
public int lengthOfLastWord(String s) {
if (s==null||s.length()==0){
return 0;
}
int count=0;
for (int i=s.length()-1;i>=0;i--){
if (s.charAt(i)==' '){
if (count==0){
continue;
}
break;
}
count++;
}
return count;
}
}
总结
本题来源于Leetcode中 归属于字符串类型题目。
同许多在算法道路上不断前行的人一样,不断练习,修炼自己!
如有博客中存在的疑问或者建议,可以在下方留言一起交流,感谢各位!
觉得本博客有用的客官,可以给个点赞+收藏哦! 嘿嘿
喜欢本系列博客的可以关注下,以后除了会继续更新面试手撕代码文章外,还会出其他系列的文章!