【每日一题】66. 加一 ,1822. 数组元素积的符号,682. 棒球比赛
给定一个由 整数 组成的 非空 数组所表示的非负整数,在该数的基础上加一。
最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。
你可以假设除了整数 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即可。
已知函数
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.
你现在是一场采用特殊赛制棒球比赛的记录员。这场比赛由若干回合组成,过去几回合的得分可能会影响以后几回合的得分。
比赛开始时,记录是空白的。你会得到一个记录操作的字符串列表
ops
,其中ops[i]
是你需要记录的第i
项操作,ops
遵循下述规则:
- 整数
x
- 表示本回合新获得分数x
"+"
- 表示本回合新获得的得分是前两次得分的总和。题目数据保证记录此操作时前面总是存在两个有效的分数。"D"
- 表示本回合新获得的得分是前一次得分的两倍。题目数据保证记录此操作时前面总是存在一个有效的分数。"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<Integer> 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'操作)都要把处理的数再放入栈中,最后再去相加,考虑好几种情况就可以过了。博主的方法比较笨,大家可以把自己的方法放在评论区。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了