一、《Java核心技术》40~90页 第三章Java基本的程序设计结构看完
字符串的码点
Java的字符按照Unicode编码,分为常用字符和辅助字符。常用字符占用2个字节,一个代码单元;辅助字符需要用两个代码单元来表示。如果从字符串中自己拿字符,可能会只拿到辅助字符的一半,无法正确表示.
String s = "\u0041\u00DF\u6771\ud801\uDC00";
int n = s.codePointCount(0,s.length());
int i = 0;
int index = s.offsetByCodePoints(0, i);
int cp = s.codePointAt(index);
if(Character.isSupplementaryCodePoint(cp)){
}
函数介绍:
一般情况下,开始到结束范围都是包括开始,不包括结束。
public int codePointCount(int beginIndex, int endIndex):返回字符串中从指定位置开始到结束的码点个数。
public int offsetByCodePoints(int index, int codePointOffset):返回码点的索引,由字符串指定开始位置加上该位置的偏移量确定。
public int codePointAt(int index):取字符串的码点。注意:此函数取得的是int型的码点,需要用转换成char型才可以字符。
public static boolean isSupplementaryCodePoint(int codePoint) {
return codePoint >= MIN_SUPPLEMENTARY_CODE_POINT
&& codePoint < MAX_CODE_POINT + 1;
}
没有找到准确的解释,据我理解,这个函数判断此码点是不是辅助字符的码点,如果是,需要连续使用 s.charAt(i++),s.charAt(i++),来取整个辅助字符;否则只需要一次s.charAt(i++)。
public static boolean isSurrogate(char ch) {
return ch >= MIN_SURROGATE && ch < (MAX_SURROGATE + 1);
}
这个函数是从后往前遍历字符串时用到的,判断该字符是否是辅助字符的一部分。如果为真,需要i--两次。
文件的输入输出
不太懂,不会用,后面学流的时候再仔细看。
控制流程
和C基本一样,略
多维数组
Java中实际上没有多维数组,只有一维数组。多维数组被解释为“数组的数组”。
所以可以方便的构造一个“不规则”数组,每一行有不同的长度。
二、LeetCode
有效的括号
public boolean isValid(String s) {
if (s.isEmpty()) {
return true;
}
int n = s.length();
int i = 0;
int j = 1;
char[] stack = new char[n+1];
stack[0] = ' ';
stack[1] = ' ';
for (; i < n; i++) {
if (s.charAt(i) == '(' || s.charAt(i) == '{' || s.charAt(i) == '[') {
stack[j++] = s.charAt(i);
}
if (s.charAt(i) == ')') {
if (stack[j - 1] == '(') {
j--;
} else {
return false;
}
}
if (s.charAt(i) == '}') {
if (stack[j - 1] == '{') {
j--;
} else {
return false;
}
}
if (s.charAt(i) == ']') {
if (stack[j - 1] == '[') {
j--;
} else {
return false;
}
}
}
if (j == 1) {
return true;
} else {
return false;
}
}
使用栈来做。