首页 > 其他分享 >2023-06-16:给你一份工作时间表 hours,上面记录着某一位员工每天的工作小时数。 我们认为当员工一天中的工作小时数大于 8 小时的时候,那么这一天就是「劳累的一天」。 所谓「表现良好的时间

2023-06-16:给你一份工作时间表 hours,上面记录着某一位员工每天的工作小时数。 我们认为当员工一天中的工作小时数大于 8 小时的时候,那么这一天就是「劳累的一天」。 所谓「表现良好的时间

时间:2023-06-16 20:00:51浏览次数:33  
标签:early 小时数 int sum 一天 员工 hours mp ans

2023-06-16:给你一份工作时间表 hours,上面记录着某一位员工每天的工作小时数。

我们认为当员工一天中的工作小时数大于 8 小时的时候,那么这一天就是「劳累的一天」。

所谓「表现良好的时间段」,意味在这段时间内,「劳累的天数」是严格 大于「不劳累的天数」。

请你返回「表现良好时间段」的最大长度。

输入:hours = [9,9,6,0,6,6,9]。

输出:3。

答案2023-06-16:

大体步骤如下:

1.首先,定义函数 func longestWPI1(hours []int) intfunc longestWPI2(hours []int) int,参数分别为一个 int 型切片 hours,返回值为 int 类型。

2.在 func longestWPI1(hours []int) int 中,声明一个 map 类型的变量 m,用于保存前缀和 sum 出现的最早位置。新建 map 时,将 0 值和 -1 下标添加到 m 中,表示前缀和为 0 的位置为 -1。

3.在 func longestWPI2(hours []int) int 中,声明一个长度为 2n+1 的切片 early,用于保存前缀和 sum 第一次出现的位置。新建 early 时,将所有下标初始化为 -2,表示都未被访问过。将 -1 的值保存至 early[n],表示前缀和为 0 的位置为 -1。

4.在双函数中,都使用变量 ans 和 sum 进行计算,ans 表示最大的表现良好时间段的长度,sum 表示前缀和。

5.遍历 hours,对于每个元素 hour,若 hour>8,则 sum 加一;否则,sum 减一。

6.如果 sum 大于 0,则表明从第一个时间点到当前时间点都是表现良好时间段,因此更新 ans 为当前时间点 i+1。

7.如果 sum ≤ 0,则表明从第一个时间点到当前时间点出现了不劳累的时间段,需要判断是否有更长的表现良好时间段。

8.在 func longestWPI1 中,如果 m 中 sum-1 的值存在,则表明从之前的那个位置到当前位置,这段时间内有多于一个劳累的时间段与不劳累的时间段,则计算这个时间段长度,并与现有 ans 取最大值。若 m 中不存在,则将当前位置的值保存至 m[sum]。

9.在 func longestWPI2 中,计算出 sum-1+n 的值(n 表示 hours 数组长度的两倍,n<<1),并判断这个值在 early 数组中是否被保存过,如果有,则表明从之前的那个位置到当前位置,这段时间内有多于一个劳累的时间段与不劳累的时间段,则计算这个时间段长度,并与现有 ans 取最大值。若该值未被访问过,则将当前位置的值保存至 early[sum+n]。

10.遍历完 hours 后,返回 ans 值即可。

时间复杂度:

双函数中的 for 循环都只会遍历一次 hours 数组,所以时间复杂度为 O(n)。

空间复杂度:

func longestWPI1 中,使用了一个 map 类型的变量和三个 int 类型的变量,其中 map 的最大空间需求为 hours 数组长度,所以空间复杂度为 O(n)。

func longestWPI2 中,使用了一个长度为 2n+1 的 int 类型切片和三个 int 类型的变量,其中切片的最大空间需求为 2n+1,所以空间复杂度为 O(n)。

综上,两个函数的空间复杂度都为 O(n)。

go完整代码如下:

package main

import "fmt"

func longestWPI1(hours []int) int {
	// key : 某个前缀和
	// value : 这个前缀和最早出现的位置
	var m = make(map[int]int)
	m[0] = -1
	var ans, sum int
	for i, hour := range hours {
		if hour > 8 {
			sum++
		} else {
			sum--
		}
		if sum > 0 {
			ans = i + 1
		} else {
			if j, ok := m[sum-1]; ok {
				ans = Max(ans, i-j)
			}
		}
		if _, ok := m[sum]; !ok {
			m[sum] = i
		}
	}
	return ans
}

func longestWPI2(hours []int) int {
	n := len(hours)
	early := make([]int, (n<<1)+1)
	for i := range early {
		early[i] = -2
	}
	early[0+n] = -1
	ans, sum := 0, 0
	for i, hour := range hours {
		if hour > 8 {
			sum++
		} else {
			sum--
		}
		if sum > 1 {
			ans = i + 1
		} else {
			index := sum - 1 + n
			if index >= 0 && early[index] != -2 {
				ans = Max(ans, i-early[index])
			}
		}
		if early[sum+n] == -2 {
			early[sum+n] = i
		}
	}
	return ans
}

func Max(x, y int) int {
	if x > y {
		return x
	}
	return y
}

func main() {
	hours := []int{9, 9, 6, 0, 6, 6, 9}
	ans1 := longestWPI1(hours)
	ans2 := longestWPI2(hours)
	fmt.Println("ans1:", ans1)
	fmt.Println("ans2:", ans2)
}

2023-06-16:给你一份工作时间表 hours,上面记录着某一位员工每天的工作小时数。 我们认为当员工一天中的工作小时数大于 8 小时的时候,那么这一天就是「劳累的一天」。 所谓「表现良好的时间_时间段

rust完整代码如下:

fn longest_wpi1(hours: Vec<i32>) -> i32 {
    let mut map = std::collections::HashMap::<i32, i32>::new();
    map.insert(0, -1);
    let mut ans = 0;
    let mut sum = 0;
    for (i, hour) in hours.iter().enumerate() {
        sum += if *hour > 8 { 1 } else { -1 };
        if sum > 0 {
            ans = i as i32 + 1;
        } else {
            if let Some(j) = map.get(&(sum - 1)) {
                ans = ans.max(i as i32 - j);
            }
        }
        map.entry(sum).or_insert(i as i32);
    }
    ans
}

fn longest_wpi2(hours: Vec<i32>) -> i32 {
    let n = hours.len();
    let mut early = vec![-2; (n << 1) + 1];
    early[n] = -1;
    let mut ans = 0;
    let mut sum = 0;
    let mut i = 0;
    while i < n {
        sum += if hours[i] > 8 { 1 } else { -1 };
        if sum > 1 {
            ans = i as i32 + 1;
        } else {
            let index = sum - 1 + n as i32;
            if index >= 0 && early[index as usize] != -2 {
                ans = ans.max(i as i32 - early[index as usize])
            }
        }
        if early[(sum + n as i32) as usize] == -2 {
            early[(sum + n as i32) as usize] = i as i32;
        }
        i += 1;
    }
    ans
}

fn main() {
    let hours = vec![9, 9, 6, 0, 6, 6, 9];
    let ans1 = longest_wpi1(hours.clone());
    let ans2 = longest_wpi2(hours);
    println!("ans1: {}", ans1);
    println!("ans2: {}", ans2);
}

2023-06-16:给你一份工作时间表 hours,上面记录着某一位员工每天的工作小时数。 我们认为当员工一天中的工作小时数大于 8 小时的时候,那么这一天就是「劳累的一天」。 所谓「表现良好的时间_时间段_02

c++完整代码如下:

#include <iostream>
#include <vector>
#include <unordered_map>
#include <algorithm>
using namespace std;

int longestWPI1(vector<int>& hours) {
    // key : 某个前缀和
    // value : 这个前缀和最早出现的位置
    unordered_map<int, int> mp;
    // 0这个前缀和,最早出现在哪?一个数也没有的时候
    mp[0] = -1;
    int ans = 0;
    int sum = 0;
    for (int i = 0; i < hours.size(); i++) {
        sum += hours[i] > 8 ? 1 : -1;
        if (sum > 0) {
            // 0...i i+1
            ans = i + 1;
        }
        else {
            // sum = -4
            // -5最早出现在哪 j  j+1...i
            if (mp.count(sum - 1)) {
                ans = max(ans, i - mp[sum - 1]);
            }
        }
        if (!mp.count(sum)) {
            mp[sum] = i;
        }
    }
    return ans;
}

int longestWPI2(vector<int>& hours) {
    int n = hours.size();
    vector<int> early((n << 1) + 1, -2);
    early[0 + n] = -1;
    int ans = 0;
    int sum = 0;
    for (int i = 0; i < hours.size(); i++) {
        sum += hours[i] > 8 ? 1 : -1;
        if (sum > 1) {
            ans = i + 1;
        }
        else {
            if (sum - 1 + n >= 0 && early[sum - 1 + n] != -2) {
                ans = max(ans, i - early[sum - 1 + n]);
            }
        }
        if (early[sum + n] == -2) {
            early[sum + n] = i;
        }
    }
    return ans;
}

int main() {
    vector<int> hours = { 9, 9, 6, 0, 6, 6, 9 };
    int ans1 = longestWPI1(hours);
    int ans2 = longestWPI2(hours);
    cout << "ans1: " << ans1 << endl;
    cout << "ans2: " << ans2 << endl;
    return 0;
}

2023-06-16:给你一份工作时间表 hours,上面记录着某一位员工每天的工作小时数。 我们认为当员工一天中的工作小时数大于 8 小时的时候,那么这一天就是「劳累的一天」。 所谓「表现良好的时间_#include_03

c语言完整代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int longestWPI1(int* hours, int hoursSize) {
    // key : 某个前缀和
    // value : 这个前缀和最早出现的位置
    int* mp = (int*)malloc(sizeof(int) * 20002);
    memset(mp, -1, sizeof(int) * 20002);
    // 0这个前缀和,最早出现在哪?一个数也没有的时候
    mp[10000] = -1;
    int ans = 0;
    int sum = 0;
    for (int i = 0; i < hoursSize; i++) {
        sum += hours[i] > 8 ? 1 : -1;
        if (sum > 0) {
            // 0...i i+1
            ans = i + 1;
        }
        else {
            // sum = -4
            // -5最早出现在哪 j  j+1...i
            if (mp[sum - 1 + 10000] != -1) {
                ans = ans > (i - mp[sum - 1 + 10000]) ? ans : (i - mp[sum - 1 + 10000]);
            }
        }
        if (mp[sum + 10000] == -1) {
            mp[sum + 10000] = i;
        }
    }
    free(mp);
    return ans;
}

// 数组替代哈希表
int longestWPI2(int* hours, int hoursSize) {
    int n = hoursSize;
    int* early = (int*)malloc(sizeof(int) * (n << 1 | 1));
    for (int i = 0; i < (n << 1 | 1); i++) {
        early[i] = -2;
    }
    early[0 + n] = -1;
    int ans = 0;
    int sum = 0;
    for (int i = 0; i < hoursSize; i++) {
        sum += hours[i] > 8 ? 1 : -1;
        if (sum > 1) {
            ans = i + 1;
        }
        else {
            if (sum - 1 + n >= 0 && early[sum - 1 + n] != -2) {
                ans = ans > (i - early[sum - 1 + n]) ? ans : (i - early[sum - 1 + n]);
            }
        }
        if (early[sum + n] == -2) {
            early[sum + n] = i;
        }
    }
    free(early);
    return ans;
}

int main() {
    int hours[7] = { 9, 9, 6, 0, 6, 6, 9 };
    int ans1 = longestWPI1(hours, 7);
    int ans2 = longestWPI2(hours, 7);
    printf("ans1: %d\n", ans1);
    printf("ans2: %d\n", ans2);
    return 0;
}

2023-06-16:给你一份工作时间表 hours,上面记录着某一位员工每天的工作小时数。 我们认为当员工一天中的工作小时数大于 8 小时的时候,那么这一天就是「劳累的一天」。 所谓「表现良好的时间_#include_04

标签:early,小时数,int,sum,一天,员工,hours,mp,ans
From: https://blog.51cto.com/moonfdd/6502230

相关文章

  • 员工管理
    1. 新增员工  2-51.1 需求分析  2-5后台系统中可以管理员工信息,通过新增员工来添加后台系统用户,点击【添加员工】按钮转到新增页面如下:新增员工,其实就是将我们新增页面录入的员工数据插入到employee表。需要注意, employee表 中对username字段加入了唯一约束,因为username......
  • 如何与员工进行有效的批评沟通
    批评是为了改变在团队管路中,对于一个我们不认可的行为,往往要通过“批评”这样的手段来“纠正他的错误”。批评背后的真实意图是“促其改变”,需要注意以下三点:对事不对人。批评事,不要打击人,更不能给人贴标签。具体性原则。指出具体哪里做的不好,让对方容易认同。面向未来......
  • 中企出海,员工海外差旅费用如何处理?
    用友的商旅云聚合了全球的商旅生态圈,把境外的商旅预订及国内的全球化商旅TMC资源比如像携程、同程商旅、CWT、BDCTrip等厂商集结,成为我们提供多元的商旅服务供应商,这些服务聚合之后支持甲方企业针对多服务商或者专业服务商进行同频比价,为企业做智能的低价推荐,节省差旅成本和商旅费......
  • 瑞吉外卖--员工登录
    前言:由于项目过大,我将按照功能模块分开发布,等到最后再合并成一篇文章代码在E:\java学习\瑞吉外卖\course  reggie_take_out1. 功能清单  1-32. 数据库搭建  42.1 搭建数据库2.2 导入表选择E:\java学习\瑞吉外卖\资料\1 瑞吉外卖项目\资料\数据模型目录下的db_reggie.sql......
  • 王道论坛是由一批名校的研究生和名企员工共同开发维护的社区,致力于让IT人员更好的享受
    王道论坛是由一批名校的研究生和名企员工共同开发维护的社区,致力于让IT人员更好的享受互联网带来的实惠,提供一个集学习、分享、成长为一体的平台网络。王道论坛已成为大家公认的最好的计算机考研论坛。这个世界有太多的嘈杂和浮躁,我们时常被孤独和无助包围着,狭小的生活圈子让我们......
  • 2023年 1月 Tita 升级|员工敬业度调查上线
     点击免费领取绩效考核模版等资料 灵活设置多种调查主题,从不同维度调查员工敬业度员工快速参与调查,极致作答体验全方位查看调查结果 ......
  • html第一天学习
    html标签标题标签:<h1>.....<h6>,特点:文字加粗,独占一行,字号逐渐减小<h1>一般用一次段落标签:<p>换行标签:<br>水平标签:<hr>格式化标签</b>加粗:<strong>倾斜:<em>下划线:<ins>删除线:<del>图片:<imgsrc=""alt=""t......
  • 6.11 中考前一天打的比赛
    http://oi.nks.edu.cn/zh/Contest/RankListOI/2364当时在坐校车,所以这场晚做了半个小时,但考的也看得过去T1:签到题http://oi.nks.edu.cn/zh/Problem/Details?cid=2364&tid=A一道构造题,比较简单,但我不太擅长构造,所以这道写了大概一个小时。思路也比较清楚,就先放限制了的数字,不能......
  • 世界上最励志、最传奇的创业家Elon Musk的一天
    ElonMusk现在是世界上最励志、最传奇的创业家。他正经营着两家改变世界的公司,北美知名电动汽车生产商Tesla和私人航天探索公司SpaceX。同时他也是SolarCity的主席,为家庭用户提供太阳能的服务。他还是PayPal的早期投资人。Musk一直把他的时间掰给两家公司,周一和周四他会呆在Spac......
  • Python+pandas使用重采样技术按时间段查看员工业绩
    如果DataFrame结构的索引是日期时间数据,或者包含日期时间数据列,可以使用resample()方法进行重采样,实现按时间段查看员工业绩的功能。DataFrame结构的resample()方法语法为:resample(rule,how=None,axis=0,fill_method=None,closed=None,label=None,convention='start',kind=N......