来一个常见的面试题练练手

threenewbee 2019-02-15 05:17:29
加精
给定一个数组序列,表示股票的价格,比如说 100 103 109 102 95 101 110 112 103 110 112 112 113 103 103 93 88 94 91 88
现在问你,哪天买入哪天卖出获得的收益最大,输出日期,日期从1开始编号
比如如上序列,结果数5和13,表示95买入113卖出收益最大。

程序的框架已经写好,在solve里面实现,要求时间复杂度是O(n),一次遍历,并且空间复杂度是O(1)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace trade_kadane_problem
{
class Program
{
static int[] GenDataSet(int n)
{
int[] result = new int[n];
Random rnd = new Random();
int b = 100;
int u = 200;
int l = 20;
int dm = 20;
for (int i = 0; i < n; i++)
{
result[i] = b;
int r = rnd.Next(dm) - dm / 2;
if (b + r > u)
b = u;
else if (b + r < l)
b = l;
else
b = b + r;
}
return result;
}

static void Stdsolve(int[] data, out int b, out int s)
{
b = 1;
s = 1;
for (int i = 0; i < data.Length; i++)
for (int j = i; j < data.Length; j++)
{
if (data[s - 1] - data[b - 1] < data[j] - data[i])
{
b = i + 1;
s = j + 1;
}
}
}

static void solve(int[] data, out int b, out int s)
{
b = 1;
s = 1;
//在这里编写代码
}

static void Print(int[] data)
{
for (int i = 0; i < data.Length; i++)
{
Console.Write(data[i] + " ");
}
Console.WriteLine();
}

static void Main(string[] args)
{
int[] arr = GenDataSet(20);
Print(arr);
int b = 0;
int s = 0;
Stdsolve(arr, out b, out s);
Console.WriteLine("std {0}~{1}", arr[b - 1], arr[s - 1]);
solve(arr, out b, out s);
Console.WriteLine("solve {0}~{1}", arr[b - 1], arr[s - 1]);
}
}
}




--------------------------------
答案
        static void solve(int[] data, out int b, out int s)
{
b = 1;
s = 1;
int b1 = b;
for (int i = 1; i < data.Length; i++)
{
if (data[i] < data[b1 - 1])
b1 = i + 1;
if (data[i] - data[b1 - 1] > data[s - 1] - data[b - 1])
{
b = b1;
s = i + 1;
}
}
}
...全文
26807 57 打赏 收藏 转发到动态 举报
写回复
用AI写文章
57 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_21182283 2019-09-01
  • 打赏
  • 举报
回复
很好!我看你可以
a62884782 2019-08-30
  • 打赏
  • 举报
回复
我来说几句话
a62884782 2019-08-30
  • 打赏
  • 举报
回复
我来说几句话
Gunne1 2019-08-01
  • 打赏
  • 举报
回复
说白了记录三个值,当前差值最大状态的最大,最小以及全局的最小值
每新增一个值,判定1)全局最小是否变化并记录
2)当前值与全局最小是否组成新的差值最大状态并记录
FF.. 2019-05-30
  • 打赏
  • 举报
回复

            int result = int.MinValue;
            int[] arr = new int[]{ 100,103,109,102,95,101,110,112,103,110,112,112,113,103,103,93,88,94,91,88 };
            for (int i = 0; i < arr.Length; i++)
            {
                for (int j = i+1; j < arr.Length; j++)
                {
                    result = (arr[j] - arr[i]) > result ? arr[j] - arr[i]: result;
                }
            }
FF.. 2019-05-30
  • 打赏
  • 举报
回复
引用 53 楼 xiejin90314 的回复:
我理解的这个我问题本质就是求数组中那二个数值差最大问题

 public static void  main(String... args) {
        int[] arr = new int[] {100,103,109,102,95,101,110,112,103,110,112,112,113,103,103,93,88,94,91,88};
        int max = arr[0], min = arr[0];
        for (int num: arr) {
            if (max < num) {
                max = num;
            }
            if (min > num) {
                min = num;
            }
        }
        log.info(" max: {}, min:{}", max, min);
    }
你不可能在后面卖出,在前面买入啊.
FF.. 2019-05-30
  • 打赏
  • 举报
回复
为啥这么多人说难......这不就个冒泡排序的变种吗...
riskcode 2019-05-26
  • 打赏
  • 举报
回复
好复杂。。。。。。
玉念聿辉 2019-04-23
  • 打赏
  • 举报
回复
喜欢这种实实在在的面试题,对了就继续不对就走人,也不用总回去等通知
左耳边的期盼 2019-04-19
  • 打赏
  • 举报
回复
学习了
晓枫メ残月 2019-04-19
  • 打赏
  • 举报
回复
这玩的是算法吧
u013438399 2019-04-18
  • 打赏
  • 举报
回复
简单点啊,你搞的这么复杂
qq_23828633 2019-04-17
  • 打赏
  • 举报
回复
感谢楼主分享1!
  • 打赏
  • 举报
回复
真的太难了吧
xiejin90314 2019-04-11
  • 打赏
  • 举报
回复
我理解的这个我问题本质就是求数组中那二个数值差最大问题

 public static void  main(String... args) {
        int[] arr = new int[] {100,103,109,102,95,101,110,112,103,110,112,112,113,103,103,93,88,94,91,88};
        int max = arr[0], min = arr[0];
        for (int num: arr) {
            if (max < num) {
                max = num;
            }
            if (min > num) {
                min = num;
            }
        }
        log.info(" max: {}, min:{}", max, min);
    }
weixin_44885662 2019-04-07
  • 打赏
  • 举报
回复
表示不懂,看不明白
gf7ikio 2019-04-03
  • 打赏
  • 举报
回复
superzmy凄临雨 2019-03-30
  • 打赏
  • 举报
回复
需要两个最小值a(最大值之前的最小值),b(最大值之后的最小值),最大值D 对于前三个数,假设为2,3,4三个不同数字 如果是2,3,4的递升顺序或者2、4、3的相对顺序,那么a=2 , M=4, b=NULL 如果是3,2,4 那么a=2,D=4,b=NULL 如果是3,4,2 那么a=3,D=4,b=2 如果是4,2,3那么a=2,D=3 如果是4,3,2那么a=2,D=NULL,b=NULL 不变式:b<a<D, 位置顺序为aDb。不断取得后面新的值x能维持不变式就刷新。 以{a,D,b}为三元组 如果x>D:{(a=b),(D=x),(b=NULL)} 否则如果x<b或b==NULL:{a,D,b=x}
superzmy凄临雨 2019-03-30
  • 打赏
  • 举报
回复
需要两个最小值a(最大值之前的最小值),b(最大值之后的最小值),最大值D 对于前三个数,假设为2,3,4三个不同数字 如果是2,3,4的递升顺序或者2、4、3的相对顺序,那么a=2 , M=4, b=NULL 如果是3,2,4 那么a=2,D=4,b=NULL 如果是3,4,2 那么a=3,D=4,b=2 如果是4,2,3那么a=2,D=3 如果是4,3,2那么a=2,D=NULL,b=NULL 不变式:b<a<D, 位置顺序为aDb。不断取得后面新的值x能维持不变式就刷新。 以{a,D,b}为三元组 如果x>D:{a,(D=x),b}或 {(a=b),(D=x),(b=NULL)};这边用x-b和D-a比较决定是哪一个 否则如果x<b或b==NULL:{a,D,b=x}
superzmy凄临雨 2019-03-30
  • 打赏
  • 举报
回复
需要两个最小值a(最大值之前的最小值),b(最大值之后的最小值),最大值D 对于前三个数,假设为2,3,4三个不同数字 如果是2,3,4的递升顺序或者2、4、3的相对顺序,那么a=2 , M=4, b=NULL 如果是3,2,4 那么a=2,D=4,b=NULL 如果是3,4,2 那么a=3,D=4,b=2 如果是4,2,3那么a=2,D=3 如果是4,3,2那么a=2,D=NULL,b=NULL 不变式:b<a<D, 位置顺序为aDb。不断取得后面新的值x能维持不变式就刷新。 以{a,D,b}为三元组 如果x>D:{a,(D=x),b}或 {(a=b),(D=x),(b=NULL)} 如果x<b:{a,D,b=x}
加载更多回复(37)

7,765

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 非技术区
社区管理员
  • 非技术区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧