Leetcode789(棧與佇列的練習題)
阿新 • • 發佈:2021-01-13
技術標籤:leetcode
7.整數反轉
*題目描述:給出一個 32 位的有符號整數,你需要將這個整數中每位上的數字進行反轉。
注意:
假設我們的環境只能儲存得下 32 位的有符號整數,則其數值範圍為 [−231, 231 − 1]。請根據這個假設,如果反轉後整數溢位那麼就返回 0。
思路:題解提到使用佇列解題,嘗試使用棧來解題,道理相同。
程式碼如下:
public class Solution
{
public int Reverse(int x)
{
int f = 1;
if (x < 0)
f *= - 1;
long temp=0;
int i=0;
int z = f*x;
Stack<int> stack=new Stack<int>();
while (z!=0)
{
stack.Push(z % 10);
z = z / 10;
}
while (stack.Count != 0)
{
temp += (stack.Pop() * (long)Math.Pow( 10, i));
i++;
}
if(f*temp>(Math.Pow(2,31)-1)||f*temp<-(Math.Pow(2,31)))
return 0;
return (int)(f*temp);
}
}
8.字串轉換整數
*題目描述:請你來實現一個 atoi 函式,使其能將字串轉換成整數。
首先,該函式會根據需要丟棄無用的開頭空格字元,直到尋找到第一個非空格的字元為止。接下來的轉化規則如下:
如果第一個非空字元為正或者負號時,則將該符號與之後面儘可能多的連續數字字元組合起來,形成一個有符號整數。
該字串在有效的整數部分之後也可能會存在多餘的字元,那麼這些字元可以被忽略,它們對函式不應該造成影響。
假如該字串中的第一個非空格字元不是一個有效整數字符、字串為空或字串僅包含空白字元時,則你的函式不需要進行轉換,即無法進行有效轉換。
在任何情況下,若函式不能進行有效的轉換時,請返回 0 。
注意:
本題中的空白字元只包括空格字元 ’ ’ 。
假設我們的環境只能儲存 32 位大小的有符號整數,那麼其數值範圍為 [−231, 231 − 1]。如果數值超過這個範圍,請返回 231 − 1 或 −231 。
思路:對首字母的各種情況進行分類即可,難點在於分類需要十分細緻,否則會出現很多漏洞。
程式碼如下:
public class Solution {
public int MyAtoi(string str) {
str = str.Trim();
if (string.IsNullOrEmpty(str))
return 0;
if (str[0] != '-' && str[0] != '+')
{
if (str[0] < '0' || str[0] > '9')
return 0;
}
int negative = 1;
long result = 0;
Queue<int> q = new Queue<int>();
for (int i = 0; i < str.Length; i++)
{
if (str[i] == '-' && i == 0)
negative = -1;
continue;
if (str[i] == '+' && i == 0)
continue;
if (str[i] < '0' || str[i] > '9')
break;
q.Enqueue(str[i] - '0');
}
while (q.Count != 0)
{
int i = q.Dequeue();
if (i == 0 && result == 0)
continue;
if (negative == 1 && q.Count > 10)
return int.MaxValue;
if (negative == -1 && q.Count > 10)
return int.MinValue;
result += i * (long)Math.Pow(10, q.Count);
if (negative == 1 && result > int.MaxValue)
return int.MaxValue;
if (negative == -1 && result * -1 < int.MinValue)
return int.MinValue;
}
return (int)result * negative;
}
}
9.迴文數
題目描述:判斷一個整數是否是迴文數。迴文數是指正序(從左向右)和倒序(從右向左)讀都是一樣的整數
思路:利用棧和隊列出棧(佇列)順序正好相反的特點,將整數的每一位分別存入棧和佇列中,在一一出棧(佇列)進行比較。
程式碼如下:
public class Solution
{
public bool IsPalindrome(int x)
{
if (x < 0)
return false;
Queue<int> queue = new Queue<int>();
Stack<int> stack = new Stack<int>();
while (x != 0)
{
queue.Enqueue(x % 10);
stack.Push(x % 10);
x = x / 10;
}
int len=stack.Count;
int i=0;
for (; i < len; i++)
{
if (stack.Pop() != queue.Dequeue())
break;
}
return i == len;
}
}