第 11 课

  • 344. 反转字符串
  • ★917. 仅仅反转字母
  • 基础知识
  • Java 内置数据类型 char
  • java Character 类
  • Character 方法
  • 字符串,字符数组互转
  • java Class String
  • 创建字符串
  • String 方法


344. 反转字符串

Leetcode知识点: 交换字符数组元素

class Solution:
    def reverseString(self, s: List[str]) -> None:
        """
        Do not return anything, modify s in-place instead.
        """
        # s.reverse()
        s[:] = s[::-1]
class Solution {
    public void reverseString(char[] s) {
        int i = 0, j = s.length - 1;
        while (i < j){
            char tmp = s[i];
            s[i] = s[j];
            s[j] = tmp;
            i++;
            j--;
        }
    }
}

★917. 仅仅反转字母

Leetcode

class Solution:
    def reverseOnlyLetters(self, s: str) -> str:
        # x, i, j = list(s), 0, len(s)-1
        # while i < j:
        #     if not x[i].isalpha(): i += 1
        #     elif not x[j].isalpha(): j -= 1
        #     else: 
        #         x[i], x[j] = x[j], x[i]
        #         i += 1
        #         j -= 1
                
        # return "".join(x)    

        t, x = [c for c in s if c.isalpha()], [] # 列表推导式      
        for c in s:
            # if c.isalpha(): x.append(t.pop())
            # else: x.append(c)
            x.append(t.pop() if c.isalpha() else c) # 条件表达式
        return "".join(x)

        # return ''.join(t.pop if c.isalpha() else c for c in s)
class Solution {
    public String reverseOnlyLetters(String s) {
        int i = 0, j = s.length() - 1;
        char[] t = s.toCharArray();
        while (i < j){        
            if (!Character.isLetter(t[i])) i++;
            else if (!Character.isLetter(t[j])) j--; 
            else {
                char tmp =t[i]; t[i] = t[j]; t[j] = tmp; 
                i++; j--;            
            }
        }
        return new String(t);
        
        // StringBuilder sb = new StringBuilder();
        // char[] t = s.toCharArray();
        // int j = s.length() - 1;
        // for (char c : t){
        //     while (j > 0 && !Character.isLetter(t[j])) j--;
        //     sb.append(Character.isLetter(c) ? t[j--] : c);
        // }
        // return sb.toString();
    }
}

基础知识

Java 内置数据类型 char

char 类型是一个单一的 16 位 Unicode 字符;
最小值是 \u0000(十进制等效值为 0);
最大值是 \uffff(即为 65535);
char 数据类型可以储存任何字符;

char letter = 'A'; // 单引号

java Character 类

Java 语言为每一个 内置数据类型 提供了对应的 包装类
当内置数据类型被当作 对象 使用的时候,编译器会把内置类型 装箱 为包装类。编译器也可以把一个对象 拆箱 为内置类型。

Java 语言为内置数据类型 char 提供了包装类 Character 类。

char ch = 'a';
char uniChar = '\u039A';  // Unicode 字符表示形式
char[] charArray ={'a', 'b', 'c', 'd', 'e'}; // 字符数组

将一个 char 类型的参数传递给需要一个 Character 类型参数的方法时,那么编译器会自动地将 char 类型参数转换为 Character 对象。 这种特征称为 装箱,反过来称为 拆箱

Character ch = 'a'; // 原始字符 'a' 装箱到 Character 对象 ch 中
char c = ch;

Character 方法

static boolean isDigit(char ch); // 是否为数字
static boolean isLetter(char ch); // 是否为字母
static boolean isLetterOrDigit(char ch); // 是否为数字或字母
s = 'abc' # python
s.isalnum()
s.isalpha()
s.isdigit()

字符串,字符数组互转

python 字符串 str 可用单引号、双引号、三引号表示,没有单独的字符类型 char ,字符也是串。

s = 'abc'
arr = list(s) # 字符串列表
s = ''.join(arr)

java 字符串 String 常量用双引号表示,字符 char 用单引号表示。

String s = "abc";
char[] arr = s.toCharArray();
String t = new String(arr);

java Class String

String 类表示字符串。 Java 程序中的所有字符串文字(例如 “abc” )都实现为此类的实例。
字符串是不变的; 它们的值在创建后无法更改。 字符串缓冲区支持可变字符串。 因为String 对象是不可变的,所以可以 共享 它们。

String str = "abc";

相当于:

char data[] = {'a', 'b', 'c'};
String str = new String(data);

类 String 包括用于检查序列的各个字符,用于比较字符串,用于搜索字符串,用于提取子字符串以及用于创建具有被翻译为大写或小写的所有字符的字符串的副本的方法。

Java 语言为字符串连接运算符(+)提供特殊支持,并为其他对象转换为字符串

除非另有说明,否则将 null 参数传递给 null 中的构造函数或方法将导致抛出 NullPointerException 。

创建字符串

String str = "Java";
String str2 = new String("Java"); // 用构造函数创建字符串:

String 创建的字符串存储在公共池中,而 new 创建的字符串对象在上。

String 类有 11 种构造方法,这些方法提供不同的参数来初始化字符串,比如提供一个字符数组参数:

char[] helloArray = { 'J', 'a', 'v', 'a'};
String helloString = new String(helloArray);  

String() // 初始化新创建的 String对象,使其表示空字符序列。
String(byte[] bytes) 
String(byte[] bytes, int offset, int length)。

如果需要对字符串做很多修改,那么应该选择使用 StringBuffer & StringBuilder 类。

String 方法

char	charAt(int index) 返回指定索引处的 char 值。
int length() 返回此字符串的长度。
char[]	toCharArray() 将此字符串转换为新的字符数组。

boolean isEmpty() Returns true if, and only if, length() is 0.

boolean contains(CharSequence s) 当且仅当此字符串包含指定的 char 值序列时,才返回 true。
boolean contentEquals(CharSequence cs) 将此字符串与指定的 CharSequence 。
boolean contentEquals(StringBuffer sb) 将此字符串与指定的 StringBuffer 。

boolean startsWith(String prefix) 测试此字符串是否以指定的前缀开头。
boolean startsWith(String prefix, int toffset) 测试从指定索引开始的此字符串的子字符串是否以指定的前缀开头。	
boolean endsWith(String suffix) 测试此字符串是否以指定的后缀结尾。
boolean equals(Object anObject) 将此字符串与指定的对象进行比较。
boolean equalsIgnoreCase(String anotherString) 将此 String与另一个 String比较,忽略了大小写。

boolean matches(String regex) 判断此字符串是否与给定的 regular expression匹配。	
boolean regionMatches(boolean ignoreCase, int toffset, String other, int ooffset, int len) 测试两个字符串区域是否相等。
boolean regionMatches(int toffset, String other, int ooffset, int len) 测试两个字符串区域是否相等。
	
int compareTo(String anotherString) 按字典顺序比较两个字符串。
int compareToIgnoreCase(String str) 按字典顺序比较两个字符串,忽略大小写差异。

static String	copyValueOf(char[] data) 相当于 valueOf(char[]) 。
static String	copyValueOf(char[] data, int offset, int count)	相当于 valueOf(char[], int, int) 。	

type: boolean, char, char[], Object, int, long, float, double.
static String	valueOf(type var) 返回type 参数的字符串表示形式。
static String	valueOf(char[] data, int offset, int count)	返回 char 数组参数的特定子数组的字符串表示形式。

int indexOf(int ch) 返回指定字符第一次出现的字符串中的索引。
int indexOf(int ch, int fromIndex)	返回指定字符第一次出现的此字符串中的索引,从指定索引处开始搜索。
int indexOf(String str) 返回指定子字符串第一次出现的字符串中的索引。
int indexOf(String str, int fromIndex) 从指定的索引处开始,返回指定子字符串第一次出现的字符串中的索引。
int lastIndexOf(int ch) 返回指定字符最后一次出现的字符串中的索引。
int lastIndexOf(int ch, int fromIndex) 返回指定字符最后一次出现的字符串中的索引,从指定的索引开始向后搜索。
int lastIndexOf(String str) 返回指定子字符串最后一次出现的字符串中的索引。
int lastIndexOf(String str, int fromIndex) 返回指定子字符串最后一次出现的字符串中的索引,从指定索引开始向后搜索。

String	repeat(int count)	返回一个字符串,其值为此字符串的串联重复 count次。

String replace(char oldChar, char newChar)	返回从替换所有出现的导致一个字符串 oldChar 在此字符串 newChar 。
String replace(CharSequence target, CharSequence replacement)	将此字符串中与文字目标序列匹配的每个子字符串替换为指定的文字替换序列。
String replaceAll(String regex, String replacement) 将给定替换的给定 regular expression匹配的此字符串的每个子字符串替换。
String replaceFirst(String regex, String replacement) 

String strip() 返回一个字符串,并删除了所有前导和尾随 white space 。
String stripLeading() 返回一个字符串,并删除了所有前导 white space 。
String stripTrailing() 返回一个字符串,并删除所有尾随 white space 。
String trim() 返回一个字符串,删除了所有前导和尾随空格,其中 space 被定义为其代码点小于或等于 'U+0020' (空格字符)的任何字符。

String[] split(String regex) 将此字符串拆分为给定 regular expression的匹配 项 。
String[] split(String regex, int limit)
CharSequence subSequence(int beginIndex, int endIndex) 返回作为此序列的子序列的字符序列。

static String	join(CharSequence delimiter, CharSequence... elements)	返回由 CharSequence elements 的副本组成的新String,该副本与指定的 delimiter的副本连接在一起。
static String	join(CharSequence delimiter, Iterable<? extends CharSequence> elements) 返回由 String 的副本组成的新 String ,其中 CharSequence elements 指定的 delimiter 的副本。

String substring(int beginIndex) 返回一个字符串,该字符串是此字符串的子字符串。
String substring(int beginIndex, int endIndex) 

String toLowerCase() 使用默认语言环境的规则将此 String所有字符转换为小写。
String toLowerCase(Locale locale) 使用给定 Locale的规则将此 String所有字符转换为 Locale 。
String toUpperCase() 
String toUpperCase(Locale locale) 	

static String	format(String format, Object... args) 使用指定的格式字符串和参数返回格式化字符串。
static String	format(Locale l, String format, Object... args) 使用指定的语言环境,格式字符串和参数返回格式化的字符串。	

byte[] getBytes() 使用平台的默认字符集将此 String编码为字节序列,将结果存储到新的字节数组中。
byte[] getBytes(String charsetName) 使用命名的字符集将此 String编码为字节序列,将结果存储到新的字节数组中。
byte[] getBytes(Charset charset) 使用给定的charset将此String编码为字节序列,将结果存储到新的字节数组中。
void	getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin)	 将此字符串中的字符复制到目标字符数组中。

Python 推导式