整数反転
タイトルの説明
32ビットの符号付き整数を指定した場合、この整数の各桁の桁を逆にする必要があります。
問題解決のアイデア
x%10の場合は1ビット、次にx / 10の場合は、境界を越えることに注意してください。
コードの実装
class Solution {
public:
int reverse(int x) {
int sum = 0;
while(x)
{
if(sum<INT_MIN/10)
return 0;
if(sum>INT_MAX/10)
return 0;
sum=sum*10+x%10;
x/=10;
}
return sum;
}
};
文字列から整数へ
タイトルの説明
文字列を整数に変換するには、atoi関数を実装してください。
まず、この関数は、最初の非スペース文字が見つかるまで、必要に応じて不要な先行スペース文字を破棄します。
最初に見つかったnull以外の文字が正または負の符号である場合、記号は可能な限り多くの連続する数字と組み合わされて整数の符号になります。最初のnull以外の文字が数値は、後続の数字と直接結合されて整数を形成します。
文字列の有効な整数部分に加えて、余分な文字がある可能性があります。これらの文字は無視できます。これらは関数に影響を与えません。
注:文字列の最初の空白以外の文字が有効な整数文字でない場合、文字列が空の場合、または文字列に空白文字のみが含まれている場合、関数を変換する必要はありません。
いずれの場合も、関数が有効な変換を実行できない場合は0を返します。
説明:
私たちの環境が32ビットのサイズの符号付き整数のみを格納できると仮定すると、値の範囲は[-231、231-1]です。値がこの範囲を超える場合、INT_MAX(231-1)またはINT_MIN(-231)を返します。
問題解決のアイデア
最初のステップ
文字列内のすべてのスペースを削除し、有効な文字の添え字のみを記録します。
それらがすべてスペースである場合は、直接0を返します
int length = s.size();
int index = 0;
while(index < length)
{
if(s[length] != ' ')
break;
index++;
}
if(index == length)
return 0;
第二段階
プラスとマイナスの判断。マークで示され、最初はポジティブ
int signal = 1;
if(s[index] = '+')
index++;
else if(s[index] = '-')
{
singal = -1;
index++;
}
第三段階
変換。最初に境界を越えるかどうかを決定し、次に変換します。
int res = 0; //保存结果
while(index<legnth)
{
//1.取一个字符
char Cur = s[index];
//2.判断是否为数字字符
if(Cur < '0' || Cur >'9')
break;
//3.判断是否越界
if (res > INT_MAX / 10 || (res == INT_MAX / 10 && (curChar - '0') > INT_MAX % 10))
{
return INT_MAX;
}
if (res < INT_MIN / 10 || (res == INT_MIN / 10 && (curChar - '0') > -(INT_MIN % 10)))
{
return INT_MIN;
}
//4.转换
res = res*10 + signal*(Cur - '0');
//5.取下一个字符
index++;
}
コードの実装
class Solution {
public:
int myAtoi(string str) {
unsigned long len = str.length();
int index = 0;
while (index < len) {
if (str[index] != ' ') {
break;
}
index++;
}
//如果全部是空格,直接返回0
if (index == len) {
return 0;
}
int sign = 1;
if (str[index] == '+') {
index++;
} else if (str[index] == '-')
{
sign = -1;
index++;
}
int res = 0;
while (index < len) {
char curChar = str[index];
if (curChar < '0' || curChar > '9') {
break;
}
if (res > INT_MAX / 10 || (res == INT_MAX / 10 && (curChar - '0') > INT_MAX % 10)) {
return INT_MAX;
}
if (res < INT_MIN / 10 || (res == INT_MIN / 10 && (curChar - '0') > -(INT_MIN % 10))) {
return INT_MIN;
}
res = res * 10 + sign * (curChar - '0');
index++;
}
return res;
}
};