490.负二进制表示问题
问题描述
小U最近了解到负二进制(base -2)的表示方法。现在给定一个整数 n,小U希望将该整数以负二进制的形式表示,并返回其对应的二进制字符串。注意,除非结果是 "0",否则返回的字符串中不能包含前导零。
负二进制是一种非标准的进制表示,使用基数 -2 而非通常的 2。在负二进制中,数位的权值是按 (-2)^i 来计算的。
解题思路
-
负二进制表示:
- 负二进制使用基数
-2,这意味着每一位的权值是(-2)^i,其中i是位数。 110在负二进制中表示1*(-2)^2 + 1*(-2)^1 + 0*(-2)^0 = 4 - 2 + 0 = 2。
- 负二进制使用基数
-
转换过程:
- 我们需要不断地将整数
n除以-2,并记录余数。 - 由于余数可能为负数,我们需要调整余数和商,使得余数始终为非负数。
- 具体来说,如果余数为负数,我们需要将其调整为正数,并相应地调整商。
- 我们需要不断地将整数
-
构建结果字符串:
- 每次得到的余数(0 或 1)应该被添加到结果字符串的末尾。
- 最后,反转结果字符串以得到正确的负二进制表示。
解题步骤
-
初始化:
- 如果
n为 0,直接返回"0"。 - 初始化一个
StringBuilder用于存储结果。
- 如果
-
循环处理:
-
当
n不为 0 时,进行以下操作:- 计算
n除以-2的余数。 - 如果余数为负数,调整余数为正数,并相应地调整
n。 - 将余数添加到
StringBuilder中。
- 计算
-
-
返回结果:
- 反转
StringBuilder中的内容,并将其转换为字符串返回。
- 反转
484.股票价格上涨天数计算
### 问题描述
小C是一名股票交易员,最近他关注某只股票的价格波动。给定该股票连续N天的价格列表 stockPrices,你需要为小C生成一个新列表,每个位置的值表示从那天起至少需要等待多少天才能看到价格上涨。如果没有上涨的情况,则对应位置的值为0。
例如,对于股票价格列表 [33, 34, 14, 12, 16],从第一天价格 33 开始,价格上涨发生在第二天价格 34,所以输出 1。若某天之后不再有价格上涨,则输出 0。
解题思路
- 初始化结果数组:创建一个与输入数组
stockPrices相同长度的数组result,用于存储每个位置的等待天数。 - 遍历输入数组:对于输入数组中的每个元素
stockPrices[i],我们需要找到从i开始,第一个比stockPrices[i]大的元素。 - 查找上涨天数:从
i+1开始遍历,直到找到比stockPrices[i]大的元素,记录下标差值(即等待天数)。如果没有找到,则该位置的等待天数为0。 - 存储结果:将计算出的等待天数存储到
result数组的相应位置。
代码
public class Main {
public static int[] solution(int N, int[] stockPrices) {
// write code here
int[] result = new int[N];
for(int i=0; i<N; i++){
boolean fincrease = false;
for(int j= i +1;j<N; j++){
if(stockPrices[j]>stockPrices[i]){
result[i] = j-i;
fincrease =true;
break;
}
}
if(!fincrease){
result[i] = 0;
}
}
return result;
}
public static void main(String[] args) {
System.out.println(java.util.Arrays.equals(solution(5, new int[]{33, 34, 14, 12, 16}), new int[]{1, 0, 2, 1, 0}));
System.out.println(java.util.Arrays.equals(solution(6, new int[]{45, 44, 46, 43, 42, 48}), new int[]{2, 1, 3, 2, 1, 0}));
System.out.println(java.util.Arrays.equals(solution(3, new int[]{10, 9, 8}), new int[]{0, 0, 0}));
}
}
优化
上述方法的时间复杂度是 O(N^2),因为对于每个元素,我们都需要遍历其后的所有元素。可以考虑使用栈来优化这个过程,将时间复杂度降低到 O(N)。