小李的伴学笔记2 | 豆包MarsCode AI刷题

57 阅读3分钟

490.负二进制表示问题

问题描述

小U最近了解到负二进制(base -2)的表示方法。现在给定一个整数 n,小U希望将该整数以负二进制的形式表示,并返回其对应的二进制字符串。注意,除非结果是 "0",否则返回的字符串中不能包含前导零。

负二进制是一种非标准的进制表示,使用基数 -2 而非通常的 2。在负二进制中,数位的权值是按 (-2)^i 来计算的。

解题思路

  1. 负二进制表示:

    • 负二进制使用基数 -2,这意味着每一位的权值是 (-2)^i,其中 i 是位数。
    • 110 在负二进制中表示 1*(-2)^2 + 1*(-2)^1 + 0*(-2)^0 = 4 - 2 + 0 = 2
  2. 转换过程:

    • 我们需要不断地将整数 n 除以 -2,并记录余数。
    • 由于余数可能为负数,我们需要调整余数和商,使得余数始终为非负数。
    • 具体来说,如果余数为负数,我们需要将其调整为正数,并相应地调整商。
  3. 构建结果字符串:

    • 每次得到的余数(0 或 1)应该被添加到结果字符串的末尾。
    • 最后,反转结果字符串以得到正确的负二进制表示。

解题步骤

  1. 初始化:

    • 如果 n 为 0,直接返回 "0"
    • 初始化一个 StringBuilder 用于存储结果。
  2. 循环处理:

    • 当 n 不为 0 时,进行以下操作:

      • 计算 n 除以 -2 的余数。
      • 如果余数为负数,调整余数为正数,并相应地调整 n
      • 将余数添加到 StringBuilder 中。
  3. 返回结果:

    • 反转 StringBuilder 中的内容,并将其转换为字符串返回。

484.股票价格上涨天数计算

### 问题描述

小C是一名股票交易员,最近他关注某只股票的价格波动。给定该股票连续N天的价格列表 stockPrices,你需要为小C生成一个新列表,每个位置的值表示从那天起至少需要等待多少天才能看到价格上涨。如果没有上涨的情况,则对应位置的值为0。 例如,对于股票价格列表 [33, 34, 14, 12, 16],从第一天价格 33 开始,价格上涨发生在第二天价格 34,所以输出 1。若某天之后不再有价格上涨,则输出 0。

解题思路

  1. 初始化结果数组:创建一个与输入数组 stockPrices 相同长度的数组 result,用于存储每个位置的等待天数。
  2. 遍历输入数组:对于输入数组中的每个元素 stockPrices[i],我们需要找到从 i 开始,第一个比 stockPrices[i] 大的元素。
  3. 查找上涨天数:从 i+1 开始遍历,直到找到比 stockPrices[i] 大的元素,记录下标差值(即等待天数)。如果没有找到,则该位置的等待天数为0。
  4. 存储结果:将计算出的等待天数存储到 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)。