1. 程式人生 > 其它 >Leetcode789(棧與佇列的練習題)

Leetcode789(棧與佇列的練習題)

技術標籤: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;
    }
}