Java每日一练(20230404) 买卖股票时机3、分数到小数、出现一次的数字2

简介: Java每日一练(20230404) 买卖股票时机3、分数到小数、出现一次的数字2

1. 买卖股票的最佳时机 III

给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格。

设计一个算法来计算你所能获取的最大利润。你最多可以完成 两笔 交易。

注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。

示例 1:

输入:prices = [3,3,5,0,0,3,1,4]

输出:6

解释:在第 4 天(股票价格 = 0)的时候买入,在第 6 天(股票价格 = 3)的时候卖出,这笔交易所能获得利润 = 3-0 = 3 。

随后,在第 7 天(股票价格 = 1)的时候买入,在第 8 天 (股票价格 = 4)的时候卖出,这笔交易所能获得利润 = 4-1 = 3 。

示例 2:

输入:prices = [1,2,3,4,5]

输出:4

解释:在第 1 天(股票价格 = 1)的时候买入,在第 5 天 (股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4 。  

注意你不能在第 1 天和第 2 天接连购买股票,之后再将它们卖出。  

因为这样属于同时参与了多笔交易,你必须在再次购买前出售掉之前的股票。


示例 3:

输入:prices = [7,6,4,3,1]

输出:0

解释:在这个情况下, 没有交易完成, 所以最大利润为 0。

示例 4:

输入:prices = [1]

输出:0


提示:

  • 1 <= prices.length <= 10^5
  • 0 <= prices[i] <= 10^5

出处:

https://edu.csdn.net/practice/24633316

代码:

import java.util.*;
public class maxProfitIII {
    public static class Solution {
        public int maxProfit(int[] prices) {
            int result = 0;
            if (prices.length == 0) {
                return result;
            }
            int firstDealSell;
            int secondDealSell;
            for (secondDealSell = prices.length - 1; secondDealSell > 0; secondDealSell--) {
                if (prices[secondDealSell - 1] < prices[secondDealSell]) {
                    break;
                }
            }
            for (firstDealSell = 1; firstDealSell < prices.length; firstDealSell++) {
                while (firstDealSell + 1 < prices.length && prices[firstDealSell + 1] >= prices[firstDealSell]) {
                    firstDealSell++;
                }
                int result1 = maxProfit(prices, 0, firstDealSell);
                int result2 = maxProfit(prices, firstDealSell + 1, secondDealSell);
                if (result1 + result2 > result) {
                    result = result1 + result2;
                }
            }
            return result;
        }
        private int maxProfit(int[] prices, int left, int right) {
            int result = 0;
            if (right - left < 1) {
                return result;
            }
            int minPrice = prices[left];
            for (int i = left + 1; i <= right; i++) {
                result = Math.max(result, prices[i] - minPrice);
                minPrice = Math.min(minPrice, prices[i]);
            }
            return result;
        }
    }
    public static void main(String[] args) {
        Solution s = new Solution(); 
        int[] prices = {3,3,5,0,0,3,1,4};
        System.out.println(s.maxProfit(prices));
        int[] prices2 = {1,2,3,4,5};
        System.out.println(s.maxProfit(prices2));
        int[] prices3 = {7,6,4,3,1};
        System.out.println(s.maxProfit(prices3));
        int[] prices4 = {1};
        System.out.println(s.maxProfit(prices4));
    }
}

输出:

6

4

0

0


2. 分数到小数

给定两个整数,分别表示分数的分子 numerator 和分母 denominator,以 字符串形式返回小数

如果小数部分为循环小数,则将循环的部分括在括号内。

如果存在多个答案,只需返回 任意一个

对于所有给定的输入,保证 答案字符串的长度小于 104

示例 1:

输入:numerator = 1, denominator = 2

输出:"0.5"


示例 2:

输入:numerator = 2, denominator = 1

输出:"2"


示例 3:

输入:numerator = 2, denominator = 3

输出:"0.(6)"


示例 4:

输入:numerator = 4, denominator = 333

输出:"0.(012)"


示例 5:

输入:numerator = 1, denominator = 5

输出:"0.2"


提示:

  • -2^31 <= numerator, denominator <= 2^31 - 1
  • denominator != 0

出处:

https://edu.csdn.net/practice/24633317

代码:

import java.util.*;
public class fractionToDecimal {
    public static class Solution {
        public String fractionToDecimal(int numerator, int denominator) {
            if (numerator == 0)
                return "0";
            StringBuilder str = new StringBuilder();
            if (numerator < 0 ^ denominator < 0)
                str.append('-');
            long dividend = Math.abs(Long.valueOf(numerator));
            long divisor = Math.abs(Long.valueOf(denominator));
            str.append(String.valueOf(dividend / divisor));
            long remainter = dividend % divisor;
            if (remainter == 0)
                return str.toString();
            str.append('.');
            Map<Long, Integer> map = new HashMap<>();
            while (remainter != 0) {
                if (map.containsKey(remainter)) {
                    str.insert(map.get(remainter), "(");
                    str.append(")");
                    break;
                }
                map.put(remainter, str.length());
                remainter *= 10;
                str.append(String.valueOf(remainter / divisor));
                remainter %= divisor;
            }
            return str.toString();
        }
    }
    public static void main(String[] args) {
        Solution s = new Solution(); 
        System.out.println(s.fractionToDecimal(1, 2));
        System.out.println(s.fractionToDecimal(2, 1));
        System.out.println(s.fractionToDecimal(2, 3));
        System.out.println(s.fractionToDecimal(4, 333));
        System.out.println(s.fractionToDecimal(1, 5));
    }
}

输出:

0.5

2

0.(6)

0.(012)

0.2


3. 只出现一次的数字 II

给你一个整数数组 nums ,除某个元素仅出现 一次 外,其余每个元素都恰出现 三次 。请你找出并返回那个只出现了一次的元素。

示例 1:

输入:nums = [2,2,3,2]

输出:3


示例 2:

输入:nums = [0,1,0,1,0,1,99]

输出:99


提示:

  • 1 <= nums.length <= 3 * 10^4
  • -2^31 <= nums[i] <= 2^31 - 1
  • nums 中,除某个元素仅出现 一次 外,其余每个元素都恰出现 三次

进阶:你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?

出处:

https://edu.csdn.net/practice/24633318

代码:

import java.util.*;
public class singleNumber {
    public static class Solution {
        public int singleNumber(int[] nums) {
            int ret = 0;
            for (int i = 0; i < 32; ++i) {
                int bitnums = 0;
                int bit = 1 << i;
                for (int num : nums) {
                    if ((num & bit) != 0)
                        bitnums++;
                }
                if (bitnums % 3 != 0)
                    ret |= bit;
            }
            return ret;
        }
    }
    public static void main(String[] args) {
        Solution s = new Solution();
        int[] nums = {2,2,3,2};
        System.out.println(s.singleNumber(nums));
        int[] nums2 = {0,1,0,1,0,1,99};
        System.out.println(s.singleNumber(nums2));    }
}

输出:

3

99


🌟 每日一练刷题专栏 🌟

持续,努力奋斗做强刷题搬运工!

👍 点赞,你的认可是我坚持的动力!

🌟 收藏,你的青睐是我努力的方向!

评论,你的意见是我进步的财富!  

主页:https://hannyang.blog.csdn.net/


目录
相关文章
|
6月前
|
Java
CSDN每日一练(Java)--小艺的英文名
CSDN每日一练(Java)--小艺的英文名
|
4月前
|
Java
Java中将保留四位小数的Double转换为String的方法详解
选择合适的方法,可以使代码更加简洁、高效,同时也能满足不同场景下的需求。
72 5
|
6月前
|
安全 Java C++
2023-3-25 java选择题每日一练
2023-3-25 java选择题每日一练
44 1
|
5月前
|
Java
Java的double值保留2位小数
【6月更文挑战第16天】Java的double值保留2位小数
226 0
|
6月前
|
Rust 索引
Rust 编程小技巧摘选(6)
Rust 编程小技巧摘选(6)
83 1
Rust 编程小技巧摘选(6)
|
6月前
|
算法 Java 索引
[Java·算法·中等] LeetCode122. 买股票的最佳时机 II 解读
[Java·算法·中等] LeetCode122. 买股票的最佳时机 II 解读
48 0
|
6月前
|
C++ Python Rust
Rust 重载运算符|复数结构的“加减乘除”四则运算
Rust 重载运算符|复数结构的“加减乘除”四则运算
104 0
Rust 重载运算符|复数结构的“加减乘除”四则运算
|
6月前
|
Linux
Linux 终端命令之文件浏览(1) cat
Linux 终端命令之文件浏览(1) cat
57 0
Linux 终端命令之文件浏览(1) cat
|
6月前
|
Go Python Rust
Rust 编程小技巧摘选(7)
Rust 编程小技巧摘选(7)
99 0
Rust 编程小技巧摘选(7)
|
6月前
|
Linux Windows Ubuntu
Windows 使用 Linux 子系统,轻轻松松安装多个linux
Windows 使用 Linux 子系统,轻轻松松安装多个linux
599 0
Windows 使用 Linux 子系统,轻轻松松安装多个linux
下一篇
无影云桌面