目录
1.转换成小写字母
2.字符串中的单词数
3.交替合并字符串
转为数组
转为StringBuilder
4.字符串压缩
5.关于同构
有效的字母异位词
字符串的排列
6.长度最小的子数组
7.小结
1.转换成小写字母
709. 转换成小写字母
难度简单220
给你一个字符串 s
,将该字符串中的大写字母转换成相同的小写字母,返回新的字符串
// class Solution {
// public String toLowerCase(String s) {
// return s.toLowerCase();
// }
// }
class Solution {public String toLowerCase(String s) {StringBuilder sb = new StringBuilder();for (int i = 0; i < s.length(); i++) {char ch = s.charAt(i);if (ch >= 'A' && ch <= 'Z') {sb.append((char)(ch+32));}else{sb.append(ch);}}return sb.toString();}
}
2.字符串中的单词数
434. 字符串中的单词数
难度简单194
统计字符串中的单词个数,这里的单词指的是连续的不是空格的字符。
请注意,你可以假定字符串里不包括任何不可打印的字符。
示例:
输入: "Hello, my name is John"
输出: 5
解释: 这里的单词是指连续的不是空格的字符,所以 "Hello," 算作 1 个单词。
class Solution {public int countSegments(String s) {String[] str=s.split(" ");int count=0;//可以避免我们去判断字符串为空或者字符串长度为零然后return 0 的情况for(int i=0;i
3.交替合并字符串
1768. 交替合并字符串
难度简单74
给你两个字符串 word1
和 word2
。请你从 word1
开始,通过交替添加字母来合并字符串。如果一个字符串比另一个字符串长,就将多出来的字母追加到合并后字符串的末尾。
返回 合并后的字符串 。
转为数组
class Solution {public static String mergeAlternately(String word1, String word2) {char[] arr1=word1.toCharArray();char[] arr2=word2.toCharArray();int len1=arr1.length,len2=arr2.length,i=0,j=0;char[] arr=new char[len1+len2]; while(i
转为StringBuilder
class Solution {public String mergeAlternately(String word1, String word2) {int m = word1.length(), n = word2.length();int i = 0, j = 0;StringBuilder ans = new StringBuilder();while (i < m || j < n) {if (i < m) {ans.append(word1.charAt(i));++i;}if (j < n) {ans.append(word2.charAt(j));++j;}}return ans.toString();}
}
4.字符串压缩
面试题 01.06. 字符串压缩
难度简单156
字符串压缩。利用字符重复出现的次数,编写一种方法,实现基本的字符串压缩功能。比如,字符串aabcccccaaa
会变为a2b1c5a3
。若“压缩”后的字符串没有变短,则返回原先的字符串。你可以假设字符串中只包含大小写英文字母(a至z)
暴力求解
当然你也可以把i=0时的情况对lastChar,lastCharNum初始化,然后循环从i=1开始,都行。 i++后,如果 现在的元素cur和上一个元素lastChar相同,就让num++; 否则 就把上个字符,上个字符个数追加到我们设定的stringBuilder上,cur赋值 给lastChar,更新 lastCharNum=1。需要上步每次追加的都是上个字符,对最后出现的字符 需要特殊处理 ,再次进行追加。
public String Main(String str) {StringBuilder stringBuilder = new StringBuilder();char lastChar = 0;int lastCharNum = 0;for (int i = 0; i < str.length(); i++) {if (i == 0) {lastChar = str.charAt(0);lastCharNum = 1;continue;}char cur = str.charAt(i);if (lastChar == cur) {lastCharNum++;} else {stringBuilder.append(lastChar).append(lastCharNum);//上次的lastChar = cur;lastCharNum = 1;}if (i == str.length() - 1) {stringBuilder.append(lastChar).append(lastCharNum);//最后一次的单独弄}}return stringBuilder.length() > str.length() ? str : stringBuilder.toString();}
实际上这个方法效率还是比较低的。
5.关于同构
有效的字母异位词
242. 有效的字母异位词
难度简单708
给定两个字符串 s
和 t
,编写一个函数来判断 t
是否是 s
的字母异位词。
注意: 若 s
和 t
中每个字符出现的次数都相同,则称 s
和 t
互为字母异位词。
示例 1:
输入: s = "anagram", t = "nagaram"
输出: true 判断是否为同构吧
字符减去字符等于数字 Arrays.equals(arr1,arr2)方法中,当arr1完全等同arr2,返回true 。完全相同就是数组中每一位的元素和元素的个数,数组长度都相同。
class Solution {public boolean isAnagram(String s, String t) {int len1=s.length();int len2=t.length();if(len1!=len2) return false;int[] arr1=new int[26],arr2=new int[26];for(int i=0;i
字符串的排列
567. 字符串的排列
难度中等
给你两个字符串 s1
和 s2
,写一个函数来判断 s2
是否包含 s1
的排列。如果是,返回 true
;否则,返回 false
。
换句话说,s1
的排列之一是 s2
的 子串 。
示例 1:
输入: s1 = "ab" s2 = "eidbaooo"
输出: true
解释: s2 包含 s1 的排列之一 ("ba").
示例 2:
输入: s1= "ab" s2 = "eidboaoo"
输出: false
设定left和right指针(left=0,right=len1-1)指向s2, arr1数组存储s1中元素和每个元素的个数 ,arr2存储s2的,并且先让arr1和arr2都存储len1个长度 的元素和 (因为你要找的同构元素就是 len1 长度) 如果s2的前len1个字符就是s1的同构字符串,直接return true; 否则就让right++ ,存储right这个位置的元素和到目前为止这个元素个数++,arr2[s2.charAt(right)-'a']++ ; 紧接着arr2[s2.charAt(left)-'a']--,left++ 。 在上述陈述中,由于是进入循环right
class Solution {public boolean checkInclusion(String s1, String s2) {int len1=s1.length(), len2=s2.length();if(len1>len2) return false;int[] arr1=new int[26],arr2=new int[26];for(int i=0;i
6.长度最小的子数组
209. 长度最小的子数组
难度中等1510
给定一个含有 n
个正整数的数组和一个正整数 target
。
找出该数组中满足其和 ≥ target
的长度最小的 连续子数组 [numsl, numsl+1, ..., numsr-1, numsr]
,并返回其长度。 如果不存在符合条件的子数组,返回 0
。
示例 1:
输入: target = 7, nums = [2,3,1,2,4,3]
输出: 2
解释: 子数组 [4,3]
是该条件下的长度最小的子数组。
思路
利用滑动窗口,设定start和end指针 (最初都指向数组的第一个元素),设定合适的窗口,进行移动,ret(子数组的长度的最小值)来接受最终返回的值每次更新迭代,sum记录从start到end之间元素的和(并且让sum初始化为0),target为目标值。
注意看题: 是 连续子数组 ! 让flag默认值是1,先让end移动,让sum先等于nums[end]; 如果sum如果sum>=target,start右移,flag = -1,更新sum,sum-=nums[start-1]; 循环,只要end
class Solution {public int minSubArrayLen(int target, int[] nums) {int ret=Integer.MAX_VALUE;//返回值默认为最大值;int sum=0;int start=0;int end=0;int flag=1;while(end=target){ret=Math.min(ret,end-start+1);start++;flag=-1;}else{end++;flag=1;}}return ret==Integer.MAX_VALUE?0:ret;}
}
然后在评论区学习了一种简洁的代码
class Solution {public int minSubArrayLen(int s, int[] nums) {int i = 0;int sum = 0;int len = 0;for (int j = 0; j < nums.length; j++) {sum += nums[j];while (sum >= s) {len = len == 0 ? j - i + 1 : Math.min(len, j - i + 1);sum -= nums[i++];}}return len;}
}
7.小结
写到这是方便我复习的哈哈哈哈哈哈,晚安!