THU2015 fall 1-2 Company

THU2015 fall 1-2 Company


描述

  公司有n个员工,编号1 ~ n。员工数量众多,需要你为他们编写一个管理系统。

  员工上班时都要登录管理系统登记一个code,离开要从管理系统上注销,员工也可以随时更新自己的code。到了下班时间,所有员工都会自动注销。公司管理人员随时都可能想要知道有多少员工上班,以及任一员工登记的code。

输入

  第一行两个整数n、m。接下来m行,每行都是以下内容之一:

I	a	c	//Log In:员工a登录,code为c。若a已登录,则将code更新为c
O	a		//Log Out:编号为a的员工注销。若a未登录,则注销无效
C			//Close:到下班时间,所有员工注销
N			//Number:询问有多少员工正在上班
Q	a		//Query:询问员工a的code(若未登录或已注销,视为-1)

输出

  一个整数,是所有询问(N、Q)的答案之和(int表示,自动溢出,不用管溢出部分)

输入样例
10	8
I	1	2
I	1	4
Q	1
C
I	2	4
O	2
Q	2
N
输出样例
3
//“Q 1”答案是4,“Q 2”答案是-1,“N”答案是0,所有答案之和为3

限制

  n <= 10,000,000

  m <= 1,000,000

  1<=a<=n

  code为[0, 2^31)的整数

  空间限制:256 MB

  时间限制:2 sec

提示

一级提示

  测试数据中,每种操作都可能频繁出现,或很少出现。因此,你的算法需要应对所有可能的情况。


代码如下:

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

const int SZ = 1 << 20;
struct fastio {   //fast io
	char inbuf[SZ];
	char outbuf[SZ];
	fastio() {
		setvbuf(stdin, inbuf, _IOFBF, SZ);
		setvbuf(stdout, outbuf, _IOFBF, SZ);
	}
}io;


#define N 10000000
#define M 1000000
int num[N + 1];
std::bitset<N + 1> bit;

int main()
{
	int n, m;
	int count = 0;
	scanf("%d%d", &n, &m);

	int ans = 0;

	while (m--)
	{
		char c;
		int a, b;
		while (scanf("%c", &c) && c != 'I' && c != 'O'&& c != 'C'&& c != 'N'&& c != 'Q');
		if (c == 'I')
		{
			scanf("%d %d", &a, &b);
			if (bit[a] == 0)
			{
				count++;
				bit.set(a);
			}
			num[a] = b;
		}
		else if (c == 'O')
		{
			scanf("%d", &a);
			if (bit[a] == 1)
			{
				bit.reset(a);
				count--;
			}
		}
		else if (c == 'C')
		{
			bit.reset();
			count = 0;
		}
		else if (c == 'Q')
		{
			scanf("%d", &a);
			
			ans += bit[a] == 1? num[a]:-1;


		}
		else if (c == 'N')
		{
			ans += bit.count();
		}
	}
	printf("%d\n", ans);
	//system("pause");
	return 0;
}


<think>我们有两个任务: 1. 将日期字符串从 "2025年01月01日" 转换为 "2025年11日"(去除前导零) 2. 获取特定日期(如2025年12日)的时间(即创建一个Date对象表示该日期) 但是用户最新的问题是:“我想在TypeScript中如何获取特定日期(2025-1-2)的时间 请问TypeScript 获取特定日期 2025年12日 的时间方法” 因此,我们主要回答第二个问题:如何创建一个表示2025年12日的Date对象。 在TypeScript(或JavaScript)中,我们可以使用Date构造函数来创建一个日期对象。有几种方式: 1. 使用字符串初始化:注意不同浏览器对字符串的解析可能有差异,推荐使用特定格式(如YYYY-MM-DD)。 2. 使用年、月、日参数:注意月份是从0开始的(0代表1月,11代表12月)。 由于用户提到了两种格式: - "2025-1-2"(这种格式在JavaScript的Date构造函数中可以直接使用,但为了兼容性,最好使用带前导零的格式或使用ISO格式) - "2025年12日"(这种格式不是标准格式,不能直接使用,需要转换) 因此,我们有两种方式: 方式一:使用标准格式字符串(ISO 8601格式:YYYY-MM-DD) ```typescript const date1 = new Date('2025-01-02'); // 注意:这里月份和日期使用两位,但一位也可以,但为了兼容性建议两位 ``` 但是,用户给出的例子是“2025-1-2”,这种格式在大多数浏览器中也是可以解析的,但为了确保安全,我们可以使用以下方法: 方式二:使用多个参数(年、月、日) ```typescript // 注意:月份是从0开始的,所以1月是0,2月是1,...,12月是11 const date2 = new Date(2025, 0, 2); // 2025年12日 ``` 方式二更可靠,因为不受解析差异的影响。 但是,用户还提到了“2025年12日”这样的字符串,如果我们有一个这样的字符串,我们需要先将其转换为Date对象可以接受的格式,或者提取出年、月、日。 因此,我们可以写一个函数,将“2025年12日”这样的字符串转换为Date对象: 步骤: 1. 使用正则表达式或字符串分割提取年、月、日。 2. 注意:月份需要减去1(因为Date的月份从0开始)。 3. 使用提取的年、月、日创建Date对象。 示例代码: ```typescript function parseChineseDate(dateStr: string): Date | null { // 匹配格式:2025年12日 或者 2025年01月02日 const match = dateStr.match(/^(\d{4})年(\d{1,2})月(\d{1,2})日$/); if (!match) { return null; // 格式不匹配 } // 提取年、月、日字符串,并转换为数字 const year = parseInt(match[1], 10); const month = parseInt(match[2], 10) - 1; // 月份从0开始 const day = parseInt(match[3], 10); // 创建Date对象 return new Date(year, month, day); } // 使用示例 const date = parseChineseDate('2025年12日'); console.log(date); // 输出:Thu Jan 02 2025 00:00:00 GMT+0800 (中国标准时间) ``` 注意:这样创建的Date对象的时间部分是00:00:00(本地时间)。 如果用户想要获取的是时间戳(从1970年11日00:00:00 UTC到该日期的毫秒数),可以使用: ```typescript const timestamp = date.getTime(); ``` 但是,用户的问题只是“获取特定日期的时间”,这里“时间”可能是指Date对象,也可能是指时间戳,或者是指时间字符串。根据上下文,我们理解为获取Date对象。 因此,总结: 1. 如果已知年、月、日数字,使用 `new Date(year, monthIndex, day)`。 2. 如果有一个字符串,格式是“2025年12日”,则使用上述函数转换。 3. 如果有一个字符串,格式是“2025-1-2”,可以直接使用 `new Date('2025-01-02')` 或 `new Date('2025-1-2')`,但后者可能有兼容性问题,建议转换为标准格式(YYYY-MM-DD)或使用前一种方法(解析后传参数)。 另外,注意时区问题:使用 `new Date(year, monthIndex, day)` 创建的是本地时区的日期,而 `new Date('2025-01-02')` 会被当作UTC时间(在有些浏览器中会解释为UTC时间,然后转换为本地时间,导致时区差异)。为了避免时区问题,推荐使用参数形式(年、月、日)创建日期。 例如:`new Date('2025-01-02')` 在UTC时区是2025年12日00:00:00 UTC,而在中国(UTC+8)会显示为2025年12日08:00:00,如果我们只需要日期部分,时间部分为00:00:00本地时间,那么使用字符串形式就会多出8小时。因此,使用多个参数的方式可以避免这个问题。 所以,强烈推荐使用多个参数的方式(即方式二)来创建本地日期的零点。 如果用户有字符串“2025-1-2”,我们可以将其转换为数字参数: ```typescript function parseDashDate(dateStr: string): Date | null { const parts = dateStr.split('-'); if (parts.length !== 3) return null; const year = parseInt(parts[0], 10); const month = parseInt(parts[1], 10) - 1; const day = parseInt(parts[2], 10); return new Date(year, month, day); } ``` 或者更通用的正则表达式: ```typescript function parseDashDate(dateStr: string): Date | null { const match = dateStr.match(/^(\d{4})-(\d{1,2})-(\d{1,2})$/); if (!match) return null; const year = parseInt(match[1], 10); const month = parseInt(match[2], 10) - 1; const day = parseInt(match[3], 10); return new Date(year, month, day); } ``` 使用示例: const date = parseDashDate('2025-1-2'); console.log(date); // 2025年12日 00:00:00 本地时间 最后,如果用户想要的是时间戳,则可以在得到Date对象后调用 `getTime()` 方法。 因此,针对用户的问题,我们给出以下答案: 在TypeScript中获取特定日期(2025年12日)的时间(即创建一个表示该日期的Date对象): 方法1:直接使用Date构造函数(推荐) ```typescript const date = new Date(2025, 0, 2); // 月份0代表1月 ``` 方法2:如果日期是以字符串形式给出,如“2025年12日”,则使用解析函数: ```typescript function parseChineseDate(dateStr: string): Date | null { const match = dateStr.match(/^(\d{4})年(\d{1,2})月(\d{1,2})日$/); if (!match) return null; const year = parseInt(match[1], 10); const month = parseInt(match[2], 10) - 1; const day = parseInt(match[3], 10); return new Date(year, month, day); } const date = parseChineseDate('2025年12日'); ``` 方法3:如果日期是以“2025-1-2”形式给出,则: ```typescript const date = new Date('2025-01-02'); // 注意时区问题,可能不是本地时间的零点 // 或者使用解析函数(避免时区问题): function parseDashDate(dateStr: string): Date | null { const match = dateStr.match(/^(\d{4})-(\d{1,2})-(\d{1,2})$/); if (!match) return null; const year = parseInt(match[1], 10); const month = parseInt(match[2], 10) - 1; const day = parseInt(match[3], 10); return new Date(year, month, day); } const date2 = parseDashDate('2025-1-2'); ``` 注意:方法3中直接使用字符串的方式可能会有时区问题,所以推荐解析后使用参数创建。 相关问题: 1. 如何避免在创建Date对象时的时区问题? 2. 如何将Date对象格式化为“YYYY年MM月DD日”的字符串? 3. 如何计算两个日期之间的时间差? 4. 如何判断一个日期是星期几?</think>在 TypeScript 中获取特定日期(如 2025 年 12 日)的时间,可以通过创建 `Date` 对象并提取时间信息实现。以下是完整解决方案: ### 方法 1:直接创建 Date 对象(推荐) ```typescript // 创建特定日期的 Date 对象(月份从0开始计数) const specificDate = new Date(2025, 0, 2); // 2025年12日 // 获取时间信息(时:分:秒.毫秒) const hours = specificDate.getHours(); const minutes = specificDate.getMinutes(); const seconds = specificDate.getSeconds(); const milliseconds = specificDate.getMilliseconds(); console.log(`时间: ${hours}:${minutes}:${seconds}.${milliseconds}`); // 输出示例: 时间: 0:0:0.0(默认午夜) ``` ### 方法 2:从日期字符串解析 ```typescript // 方法1:ISO 8601格式(推荐) const dateFromISO = new Date("2025-01-02"); console.log(dateFromISO.toTimeString()); // 输出: 08:00:00 GMT+0800(中国标准时间) // 方法2:自定义格式(需要兼容性处理) const dateFromCustom = new Date("2025/01/02"); console.log(dateFromCustom.getTime()); // 输出时间戳(毫秒) ``` ### 方法 3:获取时间戳(精确到毫秒) ```typescript // 获取 UTC 时间戳(推荐跨时区使用) const utcTimestamp = Date.UTC(2025, 0, 2); console.log(utcTimestamp); // 1735776000000 // 获取本地时间戳 const localTimestamp = new Date(2025, 0, 2).getTime(); ``` ### 关键注意事项: 1. **月份索引**:JavaScript/TypeScript 中月份从 0 开始计数(0=1月,11=12月) 2. **时区问题**: - `new Date(2025, 0, 2)` 创建本地时区时间 - `Date.UTC()` 创建 UTC 时间 3. **时间默认值**:未提供时间部分时默认为 00:00:00(午夜) 4. **日期有效性验证**: ```typescript const isValid = !isNaN(new Date(2025, 0, 2).getTime()); console.log(isValid ? "有效日期" : "无效日期"); ``` ### 完整示例:获取并格式化时间 ```typescript function getTimeFromDate(year: number, month: number, day: number): string { const date = new Date(year, month - 1, day); if (isNaN(date.getTime())) throw new Error("无效日期"); return date.toLocaleTimeString('zh-CN', { hour12: false, hour: '2-digit', minute: '2-digit', second: '2-digit' }); } console.log(getTimeFromDate(2025, 1, 2)); // 输出: 00:00:00 ``` ### 时区处理建议 ```typescript // 获取 UTC 时间 const utcHours = new Date(Date.UTC(2025, 0, 2)).getUTCHours(); // 转换为本地时间字符串 const localTime = new Date(2025, 0, 2).toLocaleTimeString('zh-CN'); ``` > ⚠️ **注意**:浏览器环境中的时间解析可能因时区设置产生差异,服务器端建议使用 UTC 时间[^1]。 --- ### 相关问题 1. 如何计算两个日期之间的时间差? 2. TypeScript 中如何处理时区转换? 3. 如何实现倒计时功能? 4. 日期验证的最佳实践是什么? 5. 在 React/Vue 中如何封装时间选择器组件?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值