题目13/100:N字形变换
将一个给定字符串 s 根据给定的行数 numRows ,以从上往下、从左到右进行 Z 字形排列。
比如输入字符串为 “PAYPALISHIRING” 行数为 3 时,排列如下:
P A H N
A P L S I I G
Y I R
之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:“PAHNAPLSIIGYIR”。
请你实现这个将字符串进行指定行数变换的函数:
string convert(string s, int numRows);
题解
class Solution {
public:string convert(string s, int numRows) {if(numRows == 1) return s;vector<string> tmpString(numRows);bool direct = false;//因为i==0 初始是true 进循环就变成false i下一把就小于0 int i = 0;string res;for(auto c: s){tmpString[i] += c;if(i == 0 || i == numRows-1){//要改变方向direct = !direct;}i += direct?1:-1;//往下就+1 往上-1}for(auto str: tmpString){res += str;}return res;}
};
题目:14/100整数反转
给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。
如果反转后整数超过 32 位的有符号整数的范围 [−231, 231 − 1] ,就返回 0。
假设环境不允许存储 64 位整数(有符号或无符号)。
题解:
思路上讲挺简单,依次取到最后一位,再除以10更新数字
class Solution {
public:int reverse(int x) {int res = 0;int num = 0;while(x){num = x%10;x = x/10;res = res*10 + num;}if(res > INT_MAX || res<INT_MIN )return 0;return res;}
};//除10取余 得到最后一位 x=x除以10
//*10+得到的数目
默认的测试案例可以通过,但提交报错
添加到测试案例,发现是当x = 1534236469时有问题,在最后一个循环的rev=964632435, res = res*10 + num > INT_MAX 发生溢出
res = res*10 + num;//有可能会溢出,所以在这之前就要判断是否满足
−2^31≤res*10 + numt≤2^31−1
修改后代码:
class Solution {
public:int reverse(int x) {int res = 0;int num = 0;while(x)//也会存在负数 非0是true{if(res > INT_MAX/ 10 || res<INT_MIN/ 10 ) //−2^31≤res*10 + numt≤2^31−1return 0;num = x%10;x = x/10;res = res*10 + num;//有可能会溢出,所以在这之前就要判断是否满足}return res;}
};//除10取余 得到最后一位 x=x除以10
//*10+得到的数目
题目:15/100 字符串转换整数
请你来实现一个 myAtoi(string s) 函数,使其能将字符串转换成一个 32 位有符号整数(类似 C/C++ 中的 atoi 函数)。
函数 myAtoi(string s) 的算法如下:
读入字符串并丢弃无用的前导空格
检查下一个字符(假设还未到字符末尾)为正还是负号,读取该字符(如果有)。 确定最终结果是负数还是正数。 如果两者都不存在,则假定结果为正。
读入下一个字符,直到到达下一个非数字字符或到达输入的结尾。字符串的其余部分将被忽略。
将前面步骤读入的这些数字转换为整数(即,"123" -> 123, "0032" -> 32)。如果没有读入数字,则整数为 0 。必要时更改符号(从步骤 2 开始)。
如果整数数超过 32 位有符号整数范围 [−231, 231 − 1] ,需要截断这个整数,使其保持在这个范围内。具体来说,小于 −231 的整数应该被固定为 −231 ,大于 231 − 1 的整数应该被固定为 231 − 1 。
返回整数作为最终结果。
注意:
本题中的空白字符只包括空格字符 ' ' 。
除前导空格或数字后的其余字符串外,请勿忽略 任何其他字符。
题解:
根据题目要求写的ifelse
class Solution {
public:int myAtoi(string s) {bool isNeg = false;bool isStart = false;int num = 0;for(auto c: s){//判断是不是空格if(c == ' ')continue;if(c == '-' && isStart == false){isNeg = true;continue;}else if(c == '+' && isStart == false ){isNeg = false;continue;}// else if(0<=(c-'0')<=9)else if (isdigit(c)){isStart = true;//开始正文了//提取数字if(num<INT_MIN/10) break;if(num>INT_MAX/10) break;num = num*10 + (c-'0');}else{isStart = true;return num;}}return isNeg?-num:num;}
};
解题错误,只通过了部分测试用例:
修改之后不断有case报错,
class Solution {
public:int myAtoi(string s) {bool isNeg = false;bool isStart = false;int num = 0;for(auto c: s){//判断是不是空格if(c == ' ')continue;if(c == '-' && isStart == false){isNeg = true;isStart = true;continue;}else if(c == '+' && isStart == false ){isNeg = false;isStart = true;continue;}// else if(0<=(c-'0')<=9)else if (isdigit(c)){isStart = true;//开始正文了//提取数字if(num<INT_MIN/10 || num>INT_MAX/10){return isNeg?INT_MIN:INT_MAX;}num = num*10 + (c-'0');}else{isStart = true;break;}}return isNeg?-num:num;}
};
应该换种思路,或者思路更全面一些,有一些些烦了,做下一题换换脑子
如果面试中遇到类似的问题,应先仔细阅读题目文字说明和示例,有疑惑的地方和需要和面试官确认,在编码的时候需要耐心和细心地调试 切记烦躁慌张
累累了
16/100回文数
给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。
回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
例如,121 是回文,而 123 不是。
题解:
边界条件:负数,个位为0的非零数
判断条件:把前部分翻转 是否和后部分相等
class Solution {
public:bool isPalindrome(int x) {if(x<0 || (x % 10 == 0 && x != 0)) return false;//转换数字,是否与原来数字相等int reverseNum = 0;while(x>reverseNum)//优化,只反转一半的数字{reverseNum = reverseNum*10 + x%10;x /= 10;}// 当数字长度为奇数时,我们可以通过 reverseNum/10 去除处于中位的数字。中位数没有关系return reverseNum == x || reverseNum/10 == x;}
};