第一遍
class Solution { public void reverseString ( char [ ] s) { char tmp; for ( int i = 0 , j = s. length - 1 ; i < s. length && j > 0 && i <= j; i++ , j-- ) { tmp = s[ i] ; s[ i] = s[ j] ; s[ j] = tmp; } }
}
第一遍
思路 还是要注意读懂题目,找到解题的窍门; 看起来有k和2k左右两个判断条件,其实只有一个k的判断条件,因为不论最后一次循环有多少个元素,始终只要反转0-k个元素。
class Solution { public String reverseStr ( String s, int k) { char [ ] chars = s. toCharArray ( ) ; for ( int i = 0 ; i < chars. length; i += 2 * k) { int start = i; int end = Math . min ( chars. length - 1 , start + k - 1 ) ; while ( start < end) { char tmpChar = chars[ start] ; chars[ start] = chars[ end] ; chars[ end] = tmpChar; start++ ; end-- ; } } return new String ( chars) ; }
}
第一遍
思路 题目完成很简单,但为了锻炼双指针还是有点难度的; 学习了一下关于StringBulider
的相关知识: StringBuilder 是 Java 中的一个类,位于 java.lang 包下,用于处理字符串的可变对象。与 String 类不同,StringBuilder 允许在不创建新对象的情况下修改字符串内容。这种可变性使得在处理大量字符串拼接或修改的情况下,StringBuilder 比直接使用 String 更加高效,因为避免了不断创建新的字符串对象。 以下是 StringBuilder 的一些主要特点和用法: 可变性: StringBuilder 对象的内容可以被修改,包括添加、插入、删除字符等操作,而不会创建新的对象。 效率: 由于可变性,StringBuilder 在执行大量字符串拼接或修改时比 String 更加高效。这是因为在 String 中每次修改都需要创建一个新的字符串对象,而 StringBuilder 可以在原有对象的基础上进行修改。 线程不安全: StringBuilder 不是线程安全的,因此在多线程环境下使用时需要进行额外的同步处理。如果需要线程安全的可变字符串,可以使用 StringBuffer 类,它提供了与 StringBuilder 类似的功能,但是所有的公共方法都是同步的。 常见方法: StringBuilder 提供了一系列方法用于字符串的操作,包括 append() 用于追加字符串、insert() 用于在指定位置插入字符串、delete() 用于删除字符、substring() 用于提取子串等。
class Main { public static void main ( String [ ] args) { String s = "a1b2c3" ; Solution solution = new Solution ( ) ; String result = String . valueOf ( solution. reverseStr ( s) ) ; System . out. println ( result) ; }
} class Solution { public StringBuilder reverseStr ( String s) { char [ ] chars = s. toCharArray ( ) ; StringBuilder newS = new StringBuilder ( ) ; for ( int i = 0 ; i < chars. length; i++ ) { if ( Character . isDigit ( chars[ i] ) ) { newS. append ( "number" ) ; } else { newS. append ( chars[ i] ) ; } } return newS; }
}
第一遍
思路 删除字符串前后的空格:trim()
返回的是String; 移除收尾的很简单了,定义开始结束的指针,开头是空格,开始指针+1,结尾同理-1,这个可以用trim代替; 其他的都要考虑自己实现一下; 回顾了一下移除元素的算法,变种可以实现移除中间元素; 这题利用StringBulider
应该会更好的练习对字符串的理解;
public class StringStructure { public static void main ( String [ ] args) { String s = " hello world abc" ; Solution solution = new Solution ( ) ; String result = solution. reverseWords ( s) ; System . out. println ( result) ; }
} class Solution { public String reverseWords ( String s) { String trimmedString = s. trim ( ) ; String eraseMidSpaceString = eraseMidSpace ( trimmedString) ; String reverseString = reverse ( eraseMidSpaceString) ; return reverseEveryWord ( reverseString) ; } public String eraseMidSpace ( String s) { char target = ' ' ; char [ ] charS = s. toCharArray ( ) ; int slow = 1 , fast = 1 ; while ( fast < s. length ( ) ) { if ( charS[ fast] == target && charS[ slow - 1 ] == target) { fast++ ; continue ; } charS[ slow] = charS[ fast] ; slow++ ; fast++ ; } char [ ] resultS = new char [ slow] ; for ( int i = 0 ; i < slow; i++ ) { resultS[ i] = charS[ i] ; } return new String ( resultS) ; } public String reverse ( String s) { char [ ] charS = s. toCharArray ( ) ; for ( int i = 0 , j = s. length ( ) - 1 ; i < s. length ( ) && j > 0 && i <= j; i++ , j-- ) { char tmp = charS[ i] ; charS[ i] = charS[ j] ; charS[ j] = tmp; } return new String ( charS) ; } public String reverseEveryWord ( String s) { char [ ] charS = s. toCharArray ( ) ; for ( int i = 0 , start = 0 ; i < s. length ( ) ; i++ ) { if ( charS[ i] == ' ' ) { for ( int j = start, k = i - 1 ; j < i && k > start && j <= k; j++ , k-- ) { char tmp = charS[ j] ; charS[ j] = charS[ k] ; charS[ k] = tmp; } start = i + 1 ; } else if ( i + 1 == s. length ( ) ) { for ( int j = start, k = i; j <= i && k > start && j <= k; j++ , k-- ) { char tmp = charS[ j] ; charS[ j] = charS[ k] ; charS[ k] = tmp; } break ; } } return new String ( charS) ; }
}
第一遍
思路 写完通过直接去看答案了。。。。。。 然后才注意到升级了难度。。。。。。 如果有二刷,需要注意升级难度
import java. util. Scanner ;
class Main { public static void main ( String [ ] args) { Scanner in = new Scanner ( System . in) ; int k = Integer . parseInt ( in. nextLine ( ) ) ; String s = in. nextLine ( ) ; Solution solution = new Solution ( ) ; String result = solution. reverseWords ( s, k) ; System . out. println ( result) ; }
} class Solution { public String reverseWords ( String s, int k) { StringBuilder sb = new StringBuilder ( ) ; for ( int i = s. length ( ) - k; i < s. length ( ) ; i++ ) { sb. append ( s. charAt ( i) ) ; } for ( int i = 0 ; i < s. length ( ) - k; i++ ) { sb. append ( s. charAt ( i) ) ; } return sb. toString ( ) ; }
}