59. 螺旋矩阵 II AND 224. 基本计算器

183 阅读1分钟

这是我参与8月更文挑战的第26天,活动详情查看:8月更文挑战

59. 螺旋矩阵 II

给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。

示例 1:

image.png

输入:n = 3
输出:[[1,2,3],[8,9,4],[7,6,5]]

示例 2:

输入: n = 1
输出: [[1]]

 

提示:

  • 1 <= n <= 20

解题思路

按层进行数字的填充,每一层都按四条边的位置依次填充。对于每层,从左上方开始以顺时针的顺序填入所有元素。左上方

代码

class Solution {
    int  z=1;
    public int[][] generateMatrix(int n) {

        int[][] matrix = new int[n][n];
        int r=matrix.length,c=matrix.length,x=0,y=0;

        put(r,c,x,y,matrix);
        return matrix;
    }
    public void put (int r,int c,int x,int y,int[][] matrix)
    {
        if(r<=0||c<=0) return;//矩阵有偶数层
        if(r==1)//矩阵有奇数层,最后一层只有一个元素
        {       
            matrix[y][x]=z;
            return;
        }

        for (int i=x;i<x+c;i++)
            matrix[y][i]=z++;


        for (int i=y+1;i<y+r-1;i++)
            matrix[i][x+c-1]=z++;

        for (int i=x+c-1;i>=x;i--)
            matrix[y+r-1][i]=z++;

        for (int i=y+r-2;i>y;i--)
            matrix[i][x]=z++;

        put(r-2,c-2,x+1,y+1,matrix);

    }
}

时间复杂度:O(n^2),其中 n 是给定的正整数。矩阵的大小是n×n,需要填入矩阵中的每个元素。

空间复杂度:O(1)。除了返回的矩阵以外,空间复杂度是常数。

224. 基本计算器

给你一个字符串表达式 s ,请你实现一个基本计算器来计算并返回它的值。

示例 1:

输入:s = "1 + 1" 输出:2 示例 2:

输入:s = " 2-1 + 2 " 输出:3 示例 3:

输入:s = "(1+(4+5+2)-3)+(6+8)" 输出:23

解题思路

使用两个栈,一个保存数字,一个保存操作符

代码

class Solution {
    public int calculate(String s) {

        Stack<Integer> stack=new Stack<>();
        Stack<Integer> characterStack=new Stack<>();
        int n=s.length();int i = 0,sign=1,cur=0;
        while ( i < n) {
            char c = s.charAt(i);
            if(c==' ') {
                i++;
                continue;
            }
            if(Character.isDigit(c))//获取操作数
            {
               int sum=0;
                while (i<n&&Character.isDigit(s.charAt(i)))
                {
                    sum*=10;
                    sum+=s.charAt(i)-'0';
                    i++;
                }
                cur+=sign*sum;
                i--;

            }else {

                if(c=='+'||c=='-')
                    sign=c=='+'?1:-1;
                else if(c=='(')//将之前的运算结果和括号前的操作符进栈,开始运算括号内的表达式
                {
                    characterStack.push(sign);
                    stack.push(cur);
                    cur=0;
                    sign=1;
                }else {//将括号内的计算结果与括号前的计算结果进行运算
                    cur=stack.pop()+cur*characterStack.pop();
                }
            }
            i++;

        }
        return cur;

    }
}