将一个给定字符串 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;
}
};
给你一个 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?1
return 0;
num = x%10;
x = x/10;
res = res*10 + num;//有可能会溢出,所以在这之前就要判断是否满足
}
return res;
}
};
//除10取余 得到最后一位 x=x除以10
//*10+得到的数目
请你来实现一个 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;
}
};
应该换种思路,或者思路更全面一些,有一些些烦了,做下一题换换脑子
如果面试中遇到类似的问题,应先仔细阅读题目文字说明和示例,有疑惑的地方和需要和面试官确认,在编码的时候需要耐心和细心地调试 切记烦躁慌张
累累了
给你一个整数 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;
}
};