文章目录
力扣第541题:反转字符串
这道题看着简单,但是自己写就遍历的时候出现了问题,想着先把长度分为2k等份或者k等份,但是都没成功,分完之后又需要写一个循环,重新reverse,哎这什么破想法,后来看了题解,题解的思路真是强大,循环i以2k自加,然后再找到需要反转的数组start和end,方法真好啊。
class Solution {
public String reverseStr(String s, int k) {
int n = s.length();
if(k == 1) return s;
char str[] = s.toCharArray();
for(int start = 0;start<n;start+=2*k)
{
int i = start;//开始值
int j = Math.min(i+k-1,n-1);//这里判断长度是否小于k
while(i<j)
{
str[i] ^=str[j];
str[j] ^=str[i];
str[i] ^=str[j];
i++;
j--;
}
}
return new String(str);
}
}
其中代码随想录中给出了使用异或运算来进行交换,就是while里面的语句,这个也挺好的,我自己尝试了一下,发现可行,且没有额外空间产生。
力扣第557题:反转字符串中的单词
这道题想了想,先取出每个单词,用split划分,然后再遍历取反,再加个空格,最后返回就行。
class Solution {
public String reverseWords(String s) {
int n = s.length();
String words[] = s.split(" ");
StringBuilder sb = new StringBuilder();
for(int i = 0 ; i<words.length;i++)
{
char ss[] = words[i].toCharArray();
reverse(ss);
sb.append(new String(ss));
if(i<words.length-1) sb.append(" ");
}
return sb.toString();
}
public void reverse(char[] s)
{
int n = s.length;
int i = 0;
int j = n-1;
while(i<j)
{
char temp = s[i];
s[i] = s[j];
s[j] = temp;
i++;
j--;
}
}
}
开始都准备看题解了,后来忍住自己做一做,还是做出来了。
力扣第151:翻转字符串里的单词
写了好长的代码,也算做出来了。
class Solution {
public String reverseWords(String s) {
if(s.length() == 0) return "";
if(s.length() == 1) return s;
String strs[] = s.split(" ");
//去掉因为split剩下长度的空格
List<String> tmp = new ArrayList<String>();
for(String str:strs)
{
if(str.length() == 0|| str==null) continue;
tmp.add(str);
}
String[] strs1 =tmp.toArray(new String[0]);
int len = strs1.length;
String copy[] = new String[len];
StringBuilder sb=new StringBuilder();
//进行反转
for(int i = 0 ;i<len;i++)
{
copy[i] = strs1[len-i-1];
}
//增加空格
for(int i = 0;i<len;i++)
{
sb.append(copy[i]);
if(i<len-1) sb.append(" ");
}
return sb.toString();
}
}
官方题解 几行搞定了:
class Solution {
public String reverseWords(String s) {
// 除去开头和末尾的空白字符
s = s.trim();
// 正则匹配连续的空白字符作为分隔符分割
List<String> wordList = Arrays.asList(s.split("\\s+"));
Collections.reverse(wordList);
return String.join(" ", wordList);
}
}
这是我对string方法不熟造成的。
trim方法:返回一个新的字符串。这个字符串将删除了原始字符串头部和尾部的空格。
join方法:
String result = String.join(“-“,“a”,“b”,“c”,“d”);
输出结果如下:a-b-c-d
力扣第387题:字符串中的第一个唯一字符
这道题让我想到之前的类似重复的题,我使用hashmap完成的,发现时间复杂度比较大。
class Solution {
public int firstUniqChar(String s) {
int n = s.length();
int ans =-1;
int res = 0;
Map<Character,Integer> map =new HashMap<>();
for(int i = 0 ;i<n;i++)
{
if(map.containsKey(s.charAt(i)))
{
map.put(s.charAt(i),map.get(s.charAt(i))+1);
}
else
{
map.put(s.charAt(i),1);
}
}
for(int i = 0 ;i<n;i++)
{
if(map.get(s.charAt(i))==1)
{
return i;
}
}
return -1;
}
}
看到评论区的几行代码,也用了下。
class Solution {
public int firstUniqChar(String s) {
int n = s.length();
for(int i = 0 ;i<n;i++)
{
int first = s.indexOf(s.charAt(i));
int nd = s.lastIndexOf(s.charAt(i));
if(first == nd) return i;
}
return -1;
}
}
这类题还是少用库函数,不过也得熟悉这些库函数方法是干嘛的就行,题解也是用的map来解得。
力扣389题:找不同
想着先排序,在做异或运算就行了。
class Solution {
public char findTheDifference(String s, String t) {
if(s==null||s.length()==0) return t.charAt(0);
char ans = ' ';
char chs[] = s.toCharArray();
char cht[] = t.toCharArray();
Arrays.sort(chs);
Arrays.sort(cht);
int i = 0;
for(i = 0 ;i<s.length();i++)
{
if((chs[i]^cht[i])!=0)
{
ans = cht[i];
break;
}
else
{
ans = cht[s.length()];
}
}
return ans;
}
}
异或运算 好快。
class Solution {
public char findTheDifference(String s, String t) {
if(s==null||s.length()==0) return t.charAt(0);
char ans = ' ';
char chs[] = s.toCharArray();
char cht[] = t.toCharArray();
int res = 0;
for(char ch:chs)
{
res ^= ch;
}
for(char ch:cht)
{
res^=ch;
}
return (char) res;
}
}
力扣第383题:赎金信
我借鉴了389题的思路:
class Solution {
public boolean canConstruct(String ransomNote, String magazine) {
int zzz[] = new int[26];
for(int i = 0 ; i<magazine.length();i++)
{
zzz[magazine.charAt(i)-'a']++;
}
for(int i = 0 ;i<ransomNote.length();i++)
{
zzz[ransomNote.charAt(i)-'a']--;
if(zzz[ransomNote.charAt(i)-'a']<0) return false;
}
return true;
}
}
力扣第242:有效的字母异词
和上一题一样的套路,真好;
class Solution {
public boolean isAnagram(String s, String t) {
int count[] = new int[26];
if(s.length()!=t.length()) return false;
for(int i = 0 ;i<s.length();i++)
{
char ch = s.charAt(i);
count[ch-'a']++;
}
for(int i = 0 ;i<s.length();i++)
{
char ch = t.charAt(i);
count[ch-'a']--;
if(count[ch-'a']<0) return false;
}
return true;
}
}
不过 ,时间却是3ms,我看看题解是怎么做的。题解是排序,看看是不是equals即可。
力扣第49题:字母异位词分组
这道题和之前异位词相似,但是呢,需要分组,这让我无从下手,不知道怎么分。
看了评论,才知道使用HashMap解决才快且好。便于理解,以后这样的分组需要知道这样,之前自己也做过,可能思想有点忘。
class Solution {
public List<List<String>> groupAnagrams(String[] strs) {
Map<String,ArrayList<String>> map = new HashMap<>();
for(String s:strs)
{
char ch[] = s.toCharArray();
Arrays.sort(ch);
String key = new String(ch);
if(!map.containsKey(key)) map.put(key,new ArrayList<>());
map.get(key).add(s);
}
return new ArrayList(map.values());
}
}
总结
今天先写到这里,不得不说,最近开始投简历了,让我有些紧张,比如京东面试需要问的手写ioc和aop,这些我都没有掌握,今晚再写一下吧,我还有好多知识要补习。