【每日一题】66. 加一 ,1822. 数组元素积的符号,682. 棒球比赛

66. 加一 - 力扣(LeetCode)

给定一个由 整数 组成的 非空 数组所表示的非负整数,在该数的基础上加一。

最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。

你可以假设除了整数 0 之外,这个整数不会以零开头。

示例 1:

输入:digits = [1,2,3]
输出:[1,2,4]
解释:输入数组表示数字 123。
class Solution {
    public int[] plusOne(int[] digits) {
        int len = digits.length;
        int flag = 0;
        for(int i = len-1 ; i >= 0 ; --i) {
            digits[i]+=1;
            if(digits[i] == 10)  {
                digits[i] = 0;
                flag = 1;
            }else {
                flag = 0;
                break;
            }
        }
        if(digits[0]==0) {
            if(len == 1 && flag == 0) digits[0]=1;
            else {
                digits[0]=1;
                int[] ans = new int[len+1];
                ans[0]=1;
                return ans;
            }
        }
        return digits;
    }
}

今天这道还是简单题。只需要做类似大数加法的事即可。从最后一位开始加,并对前面所有的位进行判定,会不会出现进位的情况。特殊情况是最高位进位,但实际上也很好解决,只需要一开始开一个多一位的数组(因为n位加+1最多n+1位),因为是最后一位+1进位得到,一旦出现最高位需要进位,那么其他位必然全都是0,只需要将最高位改为1即可。

1822. 数组元素积的符号 - 力扣(LeetCode)

已知函数 signFunc(x) 将会根据 x 的正负返回特定值:

  • 如果 x 是正数,返回 1 。
  • 如果 x 是负数,返回 -1 。
  • 如果 x 是等于 0 ,返回 0 。

给你一个整数数组 nums 。令 product 为数组 nums 中所有元素值的乘积。

返回 signFunc(product) 。

示例 1:

输入:nums = [-1,-2,-3,-4,3,2,1]
输出:1
解释:数组中所有值的乘积是 144 ,且 signFunc(144) = 1
class Solution {
    public int arraySign(int[] nums) {
        int flag = 1;
        int len = nums.length;
        for(int i = 0 ; i < len ; ++i ) {
            if(nums[i] == 0) return 0;
            else if(nums[i] > 0) continue;
            else flag *= -1; 
        }
        return flag;
    }
}

这道也是简单题。这道题实际上没有必要去加所有数字,只要去判断符号即可,一旦有0出现,必然为0。博主这里用乘-1,也可以用计数器去统计负数的个数,偶数个返回1,奇数个返回-1.

682. 棒球比赛 - 力扣(LeetCode)

你现在是一场采用特殊赛制棒球比赛的记录员。这场比赛由若干回合组成,过去几回合的得分可能会影响以后几回合的得分。

比赛开始时,记录是空白的。你会得到一个记录操作的字符串列表 ops,其中 ops[i] 是你需要记录的第 i 项操作,ops 遵循下述规则:

  1. 整数 x - 表示本回合新获得分数 x
  2. "+" - 表示本回合新获得的得分是前两次得分的总和。题目数据保证记录此操作时前面总是存在两个有效的分数。
  3. "D" - 表示本回合新获得的得分是前一次得分的两倍。题目数据保证记录此操作时前面总是存在一个有效的分数。
  4. "C" - 表示前一次得分无效,将其从记录中移除。题目数据保证记录此操作时前面总是存在一个有效的分数。

请你返回记录中所有得分的总和。

示例 1:

输入:ops = ["5","2","C","D","+"]
输出:30
解释:
"5" - 记录加 5 ,记录现在是 [5]
"2" - 记录加 2 ,记录现在是 [5, 2]
"C" - 使前一次得分的记录无效并将其移除,记录现在是 [5].
"D" - 记录加 2 * 5 = 10 ,记录现在是 [5, 10].
"+" - 记录加 5 + 10 = 15 ,记录现在是 [5, 10, 15].
所有得分的总和 5 + 10 + 15 = 30
class Solution {
    public int calPoints(String[] operations) {
        Stack st  = new Stack();
        int len = operations.length;
        int ans = 0;
        for(int i = 0 ; i < len ; ++i) {
            String tmp = operations[i];
            StringBuffer temp = new StringBuffer(tmp);
            int size = temp.length();
            if(temp.charAt(0)=='C'||temp.charAt(0)=='D'||temp.charAt(0)=='+') {
                //总是存在一个有效的分数
                if(temp.charAt(0) == 'C') {
                    st.pop();
                } else if(temp.charAt(0) == 'D') {
                    int c = 2*st.peek();
                    st.push(c);
                } else {
                    int a = st.pop();
                    int d = a+st.peek();
                    st.push(a);
                    st.push(d);
                }
            } else {
                int b = 0;
                int flag = 1;
                for(int j = 0 ; j < size ; ++j) {
                    if(temp.charAt(0)=='-') flag = -1;
                    if(temp.charAt(j)>='0'&& temp.charAt(j)<='9') {
                        if(j >= 1)   {b=b*10+(temp.charAt(j)-'0');}
                        else b+=(temp.charAt(j)-'0');
                    }
                }
                System.out.println(b*flag);
                st.push(b*flag);
            }
        }
        while(!st.empty()) ans+=st.pop();
        return ans;
    }
}

 这道题也是简单题,博主用的方法比较笨,就是直接暴力模拟。去模拟所有的情况。这道题比较坑的地方在于不管做了什么操作(除了'C'操作)都要把处理的数再放入栈中,最后再去相加,考虑好几种情况就可以过了。博主的方法比较笨,大家可以把自己的方法放在评论区。

你可能感兴趣的:(每日一题,算法,java)