剑指 Offer 20. 表示数值的字符串、29. 顺时针打印矩阵、31. 栈的压入、弹出序列、67. 把字符串转换成整数
题目描述:
[20]
请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。
数值(按顺序)可以分成以下几个部分:
若干空格
一个 小数 或者 整数
(可选)一个 ‘e’ 或 ‘E’ ,后面跟着一个 整数
若干空格
小数(按顺序)可以分成以下几个部分:
(可选)一个符号字符(‘+’ 或 ‘-’)
下述格式之一:
至少一位数字,后面跟着一个点 ‘.’
至少一位数字,后面跟着一个点 ‘.’ ,后面再跟着至少一位数字
一个点 ‘.’ ,后面跟着至少一位数字
整数(按顺序)可以分成以下几个部分:
(可选)一个符号字符(‘+’ 或 ‘-’)
至少一位数字
部分数值列举如下:
[“+100”, “5e2”, “-123”, “3.1416”, “-1E-16”, “0123”]
部分非数值列举如下:
[“12e”, “1a3.14”, “1.2.3”, “±5”, “12e+5.4”]
[29]
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。
[31]
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如,序列 {1,2,3,4,5} 是某栈的压栈序列,序列 {4,5,3,2,1} 是该压栈序列对应的一个弹出序列,但 {4,3,5,1,2} 就不可能是该压栈序列的弹出序列。
[67]
写一个函数 StrToInt,实现把字符串转换成整数这个功能。不能使用 atoi 或者其他类似的库函数。
首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止。
当我们寻找到的第一个非空字符为正或者负号时,则将该符号与之后面尽可能多的连续数字组合起来,作为该整数的正负号;假如第一个非空字符是数字,则直接将其与之后连续的数字字符组合起来,形成整数。
该字符串除了有效的整数部分之后也可能会存在多余的字符,这些字符可以被忽略,它们对于函数不应该造成影响。
注意:假如该字符串中的第一个非空格字符不是一个有效整数字符、字符串为空或字符串仅包含空白字符时,则你的函数不需要进行转换。
在任何情况下,若函数不能进行有效的转换时,请返回 0。
考察重点:
第20题单纯的情况枚举问题
第29题模拟右下左上的顺序旋转输出矩阵,当当前方向无法运动且下一方向也无法运动,则停止遍历。
第31题按照出栈顺序,模拟栈的动作即可。
第67题主要注意判断越界,这里没有使用long,而是选择使用除法和减法帮助判断
第20题
public boolean isNumber(String s) {if (s == null || s.length() == 0) return false;//去掉首位空格s = s.trim();boolean numFlag = false;boolean dotFlag = false;boolean eFlag = false;for (int i = 0; i < s.length(); i++) {//判定为数字,则标记numFlagif (s.charAt(i) >= '0' && s.charAt(i) <= '9') {numFlag = true;//判定为. 需要没出现过.并且没出现过e} else if (s.charAt(i) == '.' && !dotFlag && !eFlag) {dotFlag = true;//判定为e,需要没出现过e,并且出过数字了} else if ((s.charAt(i) == 'e' || s.charAt(i) == 'E') && !eFlag && numFlag) {eFlag = true;numFlag = false;//为了避免123e这种请求,出现e之后就标志为false//判定为+-符号,只能出现在第一位或者紧接e后面} else if ((s.charAt(i) == '+' || s.charAt(i) == '-') && (i == 0 || s.charAt(i - 1) == 'e' || s.charAt(i - 1) == 'E')) {//其他情况,都是非法的} else {return false;}}return numFlag;}
第29题
int way[][] = new int[][]{{0, 1}, {1, 0}, {0, -1}, {-1, 0}};int nowX, nowY;public int goWay(int[][] matrix, int n){nowX += way[n][0];nowY += way[n][1];if(nowX < matrix.length && nowX >= 0 && nowY < matrix[0].length && nowY >= 0 && matrix[nowX][nowY] != 101)return n;nowX -= way[n][0];nowY -= way[n][1];if(n + 1 < way.length)n ++;elsen = 0;nowX += way[n][0];nowY += way[n][1];if(nowX < matrix.length && nowX >= 0 && nowY < matrix[0].length && nowY >= 0 && matrix[nowX][nowY] != 101)return n;nowX -= way[n][0];nowY -= way[n][1];return way.length;}public int[] spiralOrder(int[][] matrix) {if(matrix.length == 0)return new int[]{};int[] list = new int[matrix.length * matrix[0].length]; int listIndex = 1;list[0] = matrix[0][0];matrix[0][0] = 101;int n = 0;while(true){n = goWay(matrix, n);if(n == way.length)break;list[listIndex++] = matrix[nowX][nowY];matrix[nowX][nowY] = 101;}return list;}
第31题
public boolean validateStackSequences(int[] pushed, int[] popped) {LinkedList<Integer> list = new LinkedList<>();int pp = 0, ps = 0;while(pp < popped.length && ps < pushed.length){if(!list.isEmpty() && list.getFirst() == popped[pp]){list.removeFirst();pp ++;continue;}while(ps < pushed.length && pushed[ps] != popped[pp]){list.addFirst(pushed[ps ++]);}if(ps < pushed.length && pushed[ps] == popped[pp]){ps ++;pp ++;continue;}return false; }while(!list.isEmpty()){if (list.removeFirst() != popped[pp++])return false;}return true;}
第67题
public int strToInt(String str) {int res = 0;if(str.length() == 0){return 0;}char[] ss = str.toCharArray();int idx = 0;for(;idx < str.length();idx ++){if(ss[idx] != ' ')break;}if(idx == str.length() || ((ss[idx] > '9' || ss[idx] < 0) && (ss[idx] != '+' || ss[idx] != '-')))return 0;int isMinus = 1;if(ss[idx] == '-'){idx ++;isMinus = -1;}else if(ss[idx] == '+'){idx ++;}for(;idx < str.length();idx ++){if(ss[idx] <= '9' && ss[idx] >= '0'){if(Integer.MAX_VALUE / 10 < res || Integer.MAX_VALUE - res * 10 < (ss[idx] - '0')){return isMinus == -1 ? Integer.MIN_VALUE : Integer.MAX_VALUE;}res = res * 10 + (ss[idx] - '0');}else{break;}}return isMinus * res;}