一、反转字符串中的单词 III
给定一个字符串 s ,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序。
示例 1:
输入:s = "Let's take LeetCode contest"
输出:"s'teL ekat edoCteeL tsetnoc"
示例 2:
输入: s = "Mr Ding"
输出:"rM gniD"
提示:
1 <= s.length <= 5 * 104
s 包含可打印的 ASCII 字符。
s 不包含任何开头或结尾空格。
s 里 至少 有一个词。
s 中的所有单词都用一个空格隔开。
相关标签
Java
作者:LeetCode
链接:https://leetcode.cn/leetbook/read/array-and-string/c8su7/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
二、c++解答
c语言,位运算
void fanzhuan(char* s,int first,int last);
char * reverseWords(char * s){
int slow=0,fast=0,s_length=strlen(s);
while(1)
{
if((s[fast+1]==' '||s[fast+1]=='\0')&&s[fast]!=' ')
{
fanzhuan(s,slow,fast);
if(fast+1==s_length)return s;
slow=fast+2;
}
fast++;
}
}
void fanzhuan(char*s,int first,int last)
{
while(first<last)
{
s[first]=s[first]^s[last];
s[last]=s[first]^s[last];
s[first]=s[first]^s[last];
first++;
last--;
}
}
作者:leeya_bug
链接:https://leetcode.cn/leetbook/read/array-and-string/c8su7/?discussion=3lLx6L
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
三、Java解答整体过程
1.路途耳目新
1.1额外定义变量实现反转
不能用slow 和fast直接换顺序,是全局变量,后面的遍历字符串会受影响
1.2Java String、 StringBuilder
1.2.1
无法像数组那般通过s[index]获得,在index索引对应的值,需要通过s.charAt(index)获得
Java String 类
Java String类的常用方法使用方法
1.2.2
char a=s1.charAt(fast);
得到的是char类型,只能和''同类型比较,不能和" "(字符串)
1.2.3
The left-hand side of an assignment must be a variable
String是不可变的,转换成StringBuilder,使用s1.setCharAt(index,temp)
Java——StringBuilder与String相互转换
Java-修改 String 指定位置的字符最全方法总结(StringBuilder 和 StringBuffer 的使用以及区别)
1.2.4
The method setCharAt(int, char) in the type AbstractStringBuilder is not applicable for the arguments (int, int)
1.2.5
String类的结尾并没‘\0'字符,参考方法受限
Exception in thread "main" java.lang.StringIndexOutOfBoundsException: index 27, length 27
因此用if-else if 对最后一个单词实现单独的顺序反转
针对于溢出,进行了调试
如何用Eclipse调试(debug)Java代码?
1.3异或运算^
c++位运算符 | & ^ ~ && ||,补码,反码
^ 运算---------------------------不同则为1,相同则为0 // 当且仅当两个运算值中有一个为1但不同时为1时,返回值为1
0^1=1;
1^0=1;
1^1=0;
0^0=0;
00111
^ =11011
11100
^运算通常用于对二进制的特定一位进行取反操作,^运算的逆运算是它本身,也就是说两次异或同一个数最后结果不变,即(a^b)^b=a;
^运算可以用于简单的加密,比如原始值int a = 19880516;密钥 int key =1314520; 进行加密 int data=key^a = 20665500;解密 data^key == a;
^运算还可以实现两个值的交换而不需要中间变量,例如:
先看加减法中交换实现
void swap(long int &a,long int &b)
{
a = a+b;
b = a-b;
a = a-b;
}
void swap(long int &a,long int &b)
{
a = a^b;
b = a^b;
a = a^b;
}
所以 ^运算可以理解成类似加法(+)记忆 , 1+1 =0,1+0 =1,0+1 =1;0+0 =0;//因为机器码是二进制,1+1=2%2 =0,其实不然
————————————————
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/wuguai4/article/details/7311953
1.4如何用Eclipse调试(debug)Java代码?
如何用Eclipse调试(debug)Java代码?
2.最终结果-完整代码
package Day3_19;public class Test13 {public static String reverseWords(String s) {StringBuilder s1= new StringBuilder(s);int len=s.length();int i=0,slow=0,fast=0;int first=0,last=0;char temp=' ';for(fast=0;fast<len;fast++){/*if(s[fast+1]==" "||s[fast+1]=="\0"){while(slow<fast){s[slow]=s[slow]^s[fast];s[fast]=s[fast]^s[slow];s[slow]=s[slow]^s[fast];fast++;last--;}}不能用slow 和fast直接换顺序,是全局变量,后面的遍历字符串会受影响*///char a=s1.charAt(fast);//得到的是char类型,只能和''同类型比较,不能和" "(字符串)if(fast==len-1) {first=slow;last=fast;while(first<last) {temp=s1.charAt(first);s1.setCharAt(first, s1.charAt(last));s1.setCharAt(last, temp);first++;last--;}}else if(s1.charAt(fast+1)==' '){first=slow;last=fast;while(first<last){/*//The left-hand side of an assignment must be a variable//只能根据索引获得对应的字符,但是没有办法赋值s.charAt(first)=s.charAt(first)^s.charAt(last);s.charAt(last)=s.charAt(first)^s.charAt(last);s.charAt(first)=s.charAt(first)^s.charAt(last);*//*s1.setCharAt(first,s1.charAt(first)^s1.charAt(last));s1.charAt(last)=s1.charAt(first)^s1.charAt(last);s1.charAt(first)=s1.charAt(first)^s1.charAt(last);//The method setCharAt(int, char) in the type AbstractStringBuilder //is not applicable for the arguments (int, int)*/temp=s1.charAt(first);s1.setCharAt(first, s1.charAt(last));s1.setCharAt(last, temp);first++;last--;}if(fast==len-1) {s=s1.toString();return s; }slow=fast+2;}//fast++;}s=s1.toString();return s; }public static void main(String[] args) {String s="Let's take LeetCode contest";//reverseWords(s);System.out.println(reverseWords(s));}}
四总结
1.对全局变量认识加深,在写的时候有所思考👍
2.对于Java的String 类和StringBuider类需要加深学习和思考,途中很多坎坷都是因为不知💪
3.位运算了解掌握🤔
4.eclipse调试get(之前就想着学,这次会了!)👍
5.不同语言之间的差异明显感知🤔