public static String replaceSpace(String s) {
if (s==null){
return null;
}
StringBuffer str = new StringBuffer();
for (int i=0;i<s.length();i++){
if (’ '==s.charAt(i)){
str.append(" ");//连接两个空格
}
}
if (str.length()==0){
return s;
}
int left = s.length()-1;
s+=str.toString();
int right = s.length()-1;
char[] cs = s.toCharArray();
while (left>=0){
if (cs[left]==’ '){
cs[right–]=‘0’;
cs[right–]=‘2’;
cs[right]=‘%’;
}else {
cs[right]=cs[left];
}
left–;
right–;
}
return new String(cs);
}
=========================================================================
首先去掉字符串前后的空格,我们利用双指针算法,区分有空格和无空格的情况即可
public static String reverseWords(String s) {
if (s==null){
return null;
}
String trim = s.trim();
StringBuilder str = new StringBuilder();
int left = trim.length()-1;
int right = trim.length()-1;
while (left>=0){
if (left>0&&’ '==trim.charAt(left-1)){
str.append(trim.substring(left,right+1));
while (’ '==trim.charAt(left-1)){
left–;
}
}else if (’ '==trim.charAt(left)){
str.append(" ");
left–;
right=left;
}else if (left==0){
str.append(trim.substring(left,right+1));
left–;
}
else {
left–;
}
}
return new String(str);
}
===============================================================================
解题思路,不申请额外空间的情况下,我们采用小旋转->大旋转的思路,使每个局部进行翻转,以达到总体翻转的效果
public static String reverseLeftWords(String s, int n) {
char[] chars = s.toCharArray();
//局部翻转
for (int i=0,j=n-1;i<n/2;i++,j–){
char c = chars[i];
chars[i]=chars[j];
chars[j]=c;
}
for (int i=n,j=s.length()-1;i<(n+s.length())/2;i++,j–){
char c = chars[i];
chars[i]=chars[j];
chars[j]=c;
}
//整体翻转
for (int i=0,j=s.length()-1;i<s.length()/2;i++,j–){
char c = chars[i];
chars[i]=chars[j];
chars[j]=c;
}
return new String(chars);
}
在leetcode题解中看到一个很骚的解题方式:直接取余
0.0
public static String reverseLeftWords(String s, int n) {
int len = s.length();
StringBuilder str = new StringBuilder();
for (int i=n;i<n+s.length();i++){
str.append(s.charAt(i%s.length()));
}
return str.toString();
}
==========================================================================
直接KMP算法解决
关于KMP算法的介绍使用请看我的上一篇博文KMP算法解决字符串匹配问题(详细步骤图解)
public static int strStr(String haystack, String needle){
if (needle.length()==0){
return 0;
}
int[] next = new int[needle.length()];
getNext(next,needle);
for (int i=0,j=0;i<haystack.length();i++){
while (j>0&&haystack.charAt(i)!=needle.charAt(j)){
j=next[j-1];
}
if (haystack.charAt(i)==needle.charAt(j)){
j++;
}
if (j==needle.length()){
return i-j+1;
}
}
return -1;
}
private static void getNext(int[] next,String needle){
int len = needle.length();
next[0]=0;
//ABCDABD
for (int i=1,j=0;i<len;i++){
while (j>0&&needle.charAt(i)!=needle.charAt(j)){
j=next[j-1];
}
if (needle.charAt(i)==needle.charAt(j)){
j++;
}
next[i]=j;
}
}
=======================================================================
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)
总结
虽然我个人也经常自嘲,十年之后要去成为外卖专员,但实际上依靠自身的努力,是能够减少三十五岁之后的焦虑的,毕竟好的架构师并不多。
架构师,是我们大部分技术人的职业目标,一名好的架构师来源于机遇(公司)、个人努力(吃得苦、肯钻研)、天分(真的热爱)的三者协作的结果,实践+机遇+努力才能助你成为优秀的架构师。
如果你也想成为一名好的架构师,那或许这份Java成长笔记你需要阅读阅读,希望能够对你的职业发展有所帮助。
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
,十年之后要去成为外卖专员,但实际上依靠自身的努力,是能够减少三十五岁之后的焦虑的,毕竟好的架构师并不多。
架构师,是我们大部分技术人的职业目标,一名好的架构师来源于机遇(公司)、个人努力(吃得苦、肯钻研)、天分(真的热爱)的三者协作的结果,实践+机遇+努力才能助你成为优秀的架构师。
如果你也想成为一名好的架构师,那或许这份Java成长笔记你需要阅读阅读,希望能够对你的职业发展有所帮助。
[外链图片转存中…(img-4waLE5As-1713462954409)]
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!