day2-006-数组-数组加一

本文探讨了如何解决数组加一问题,通过两种不同的解法进行对比,包括基本的大数加法实现和一种更高级的解决方案。高级解法巧妙地处理了999+1=1000的情况,提高了代码效率。

数组加一

我的思路是基于大数加法。如果有进位那就将他们在后面加上一位就好了。

class Solution {
public:
	void plus(vector<int>& digits,int i){
			if(digits.size()==i)digits.push_back(1);
			else if(digits[i]+1==10){
				digits[i]=0;
				plus(digits,i+1);
			}
			else{
				digits[i]+=1;
			}	
	}
    vector<int> plusOne(vector<int>& digits) {
    	if(digits[digits.size()-1]==9){
			reverse(digits.begin(),digits.end());
			plus(digits,0);
			reverse(digits.begin(),digits.end());
			return digits;
		}
		else{
			digits[digits.size()-1]+=1;
			return digits;
		}
		
    }
};

在这里插入图片描述

更加高级的解法:主要是都没有利用最后一个特殊情况是因为999+1=1000了,不得不说妙啊

class Solution {
    public int[] plusOne(int[] digits) {
        for (int i = digits.length - 1; i >= 0; i--) {
            digits[i]++;
            digits[i] = digits[i] % 10;
            if (digits[i] != 0) return digits;
        }
        digits = new int[digits.length + 1];
        digits[0] = 1;
        return digits;
    }
}

作者:yhhzw
链接:https://leetcode-cn.com/problems/plus-one/solution/java-shu-xue-jie-ti-by-yhhzw/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

在这里插入图片描述

<think>我们需要根据个日期数组来判断在日历上显示哪些日期。通常,日历显示会包括当前月份的日期,但有时也需要根据特定数组(比如有事件的日期)来高亮显示或标记某些日期。 假设我们有个需求:我们有个日期数组(例如 ['2024-05-01', '2024-05-15']),然后我们要生成个日历视图(比如当前月为2024年5月),并在生成的日历中标记数组里包含的日期。 实现思路: 1. 首先,我们需要生成指定月份(例如2024年5月)的日历。这意味着我们要知道这个月的第天是星期几,以及这个月有多少天。 2. 然后,我们需要根据这些信息生成个二维数组(或列表)来表示日历的每周(通常为6周,因为个月最多跨6周)。 3. 在生成每天的时候,检查这天是否在给定的日期数组中。如果在,则做标记(比如个特殊样式或者添个标记符号)。 我们将使用Python的`calendar`模块来帮助我们获取月份的信息。 但是注意:给定的日期数组可能是字符串格式,我们需要将它们转换成可以比较的格式(比如`datetime.date`对象)。 步骤: 1. 导入必要的模块:`calendar`和`datetime`。 2. 定义个函数,参数为年份、月份和需要标记的日期数组(字符串数组,格式为'YYYY-MM-DD')。 3. 使用`calendar.monthcalendar(year, month)`获取个表示月份日历的二维数组,其中每周是个列表,列表中的元素为日期(1-31),0表示非当前月的日期。 4. 将需要标记的日期数组转换为个集合(便于快速查找),集合中的元素为日期的天数(注意:这里不能只比较天数,因为不同月份可能有相同的天数,所以我们可以存储整个日期字符串或者只存储日期部分,但在同个月份内,我们可以只比较天数?但是注意,我们只标记当前月份内的日期,所以我们可以只存储天数?不行,因为不同年份和月份的日期可能重复。所以安全做法是存储整个日期字符串,然后我们在生成每天时构造该天的日期字符串,然后检查是否在集合中。 因此,我们这样做: - 构造个集合,包含所有要标记的日期字符串(例如['2024-05-01','2024-05-15'])。 - 在生成日历每天时,对于非0的日期(即当前月的日期),我们构造该天的字符串(格式为'YYYY-MM-DD'),然后检查这个字符串是否在集合中。如果在,则标记。 但是注意:`monthcalendar`返回的二维数组中,0表示其他月份的日期,这些日期我们不需要标记,因为它们不在当前月。 我们将生成个二维数组,每个元素是个元组(date, marked),其中date是日期(如果是当前月则为1-31,非当前月为0),marked是个布尔值表示是否标记。 或者,我们可以生成个二维数组,每个元素就是日期(对于非当前月用None或者空字符串表示),然后单独用个标记数组?但为了简单,我们可以直接生成个包含标记信息的列表。 然而,我们返回的日历数据可能是为了渲染,所以我们可以返回个结构,其中包含: - 该天在当前月中的日期(整数,如果是当前月,否则为0或None) - 是否标记(布尔值) 但是注意,标记只对当前月的日期有效。 另种做法:我们返回个二维数组,每个元素是个字典,例如:{'day': 1, 'marked': True},对于非当前月的日期,可以设为{'day': 0, 'marked': False},或者用None表示。 具体实现: 我们将创建个函数`generate_calendar_with_marks(year, month, marked_dates)`,其中`marked_dates`是个日期字符串列表(格式为'YYYY-MM-DD')。 步骤: 1. 将`marked_dates`转换为集合,以便快速查找。 2. 使用`calendar.monthcalendar(year, month)`得到该月的日历矩阵。 3. 遍历这个矩阵的每周(每行)和每天(每列)。 4. 对于每天: 如果该天不为0,则构造该天的日期字符串(格式:f"{year}-{month:02d}-{day:02d}") 检查这个字符串是否在标记日期的集合中,如果在,则标记为True,否则False。 然后保存为字典:{'day': day, 'marked': flag} 如果该天为0,则用个字典表示:{'day': 0, 'marked': False}(或者也可以设为None,但这里我们用0表示非当前月的日期) 5. 返回这个二维数组。 注意:月份和日子都要格式化为两位数,比如5月要变成05,1号变成01。 但是注意:`monthcalendar`返回的矩阵中,每周从星期开始?这取决于`calendar`模块的设置,默认情况下,`calendar`模块将星期作为周的第天(索引0),星期日作为最后天(索引6)。但有些地区习惯将星期日作为第天。我们可以通过设置`calendar.setfirstweekday`来改变。这里我们按照默认的周到周日。 如果我们需要不同的周起始日,可以调整。 下面我们用代码实现,并允许指定周的第天(可选参数,默认使用calendar.MONDAY)。 另外,我们还可以返回星期几的标题(比如['Mon','Tue','Wed','Thu','Fri','Sat','Sun']),但题目没有要求,我们可以选择返回。 根据要求,我们只生成日历数据。 代码实现: </think># 根据日期数组在日历中显示特定日期 我将介绍如何使用JavaScript创建个日历组件,并根据给定的日期数组高亮显示特定日期。 ## 思路分析 1. 创建个日历组件显示指定月份 2. 使用数组存储需要高亮显示的日期 3. 在渲染日历时检查每个日期是否在数组中 4. 为特殊日期添样式标记 ## 代码实现 ```html <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>日期日历高亮显示</title> <style> * { box-sizing: border-box; font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; } .calendar-container { max-width: 600px; margin: 30px auto; background: linear-gradient(135deg, #f5f7fa 0%, #c3cfe2 100%); border-radius: 15px; box-shadow: 0 10px 30px rgba(0, 0, 0, 0.15); padding: 25px; } .calendar-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 25px; } .month-nav { background: #4a69bd; color: white; border: none; border-radius: 50%; width: 40px; height: 40px; font-size: 20px; cursor: pointer; transition: all 0.3s ease; display: flex; align-items: center; justify-content: center; } .month-nav:hover { background: #1e3799; transform: scale(1.1); } .month-year { font-size: 28px; font-weight: 600; color: #1e3a8a; text-align: center; } .weekdays { display: grid; grid-template-columns: repeat(7, 1fr); margin-bottom: 15px; text-align: center; } .weekday { font-weight: 600; color: #4a5568; padding: 10px 0; } .days-grid { display: grid; grid-template-columns: repeat(7, 1fr); gap: 8px; } .day { height: 65px; display: flex; align-items: center; justify-content: center; border-radius: 10px; background-color: rgba(255, 255, 255, 0.7); font-size: 18px; font-weight: 500; cursor: pointer; transition: all 0.2s ease; position: relative; overflow: hidden; } .day:hover { background-color: #e2e8f0; transform: translateY(-3px); } .other-month { color: #a0aec0; background-color: rgba(255, 255, 255, 0.4); } .highlighted { background: linear-gradient(135deg, #43cea2 0%, #185a9d 100%); color: white; font-weight: 600; box-shadow: 0 4px 10px rgba(66, 153, 225, 0.4); } .highlighted::after { content: ""; position: absolute; top: 5px; right: 5px; width: 8px; height: 8px; background-color: #ff7a00; border-radius: 50%; } .controls { display: flex; flex-wrap: wrap; gap: 15px; margin-top: 30px; background: white; padding: 20px; border-radius: 12px; box-shadow: 0 4px 10px rgba(0, 0, 0, 0.05); } .date-input { padding: 12px; border: 2px solid #cbd5e0; border-radius: 8px; font-size: 16px; flex: 1; min-width: 200px; } .add-btn { background: #4a69bd; color: white; border: none; padding: 12px 20px; border-radius: 8px; cursor: pointer; font-size: 16px; font-weight: 600; transition: background 0.3s ease; } .add-btn:hover { background: #1e3799; } .highlighted-dates { margin-top: 25px; background: white; padding: 20px; border-radius: 12px; box-shadow: 0 4px 10px rgba(0, 0, 0, 0.05); } .highlighted-dates h3 { color: #2d3748; margin-top: 0; margin-bottom: 15px; } .date-chip { display: inline-block; background: #ebf8ff; color: #2b6cb0; padding: 6px 12px; border-radius: 20px; margin: 5px; font-size: 14px; font-weight: 500; } </style> </head> <body> <div class="calendar-container"> <div class="calendar-header"> <button class="month-nav" id="prev-month"><</button> <h2 class="month-year" id="current-month-year">五月 2024</h2> <button class="month-nav" id="next-month">></button> </div> <div class="weekdays"> <div class="weekday">周</div> <div class="weekday">周二</div> <div class="weekday">周三</div> <div class="weekday">周四</div> <div class="weekday">周五</div> <div class="weekday">周六</div> <div class="weekday">周日</div> </div> <div class="days-grid" id="calendar-days"></div> <div class="controls"> <input type="date" class="date-input" id="date-input" value="2024-05-15"> <button class="add-btn" id="add-btn">添高亮日期</button> </div> <div class="highlighted-dates"> <h3>高亮日期:</h3> <div id="highlighted-list"> <span class="date-chip">2024-05-01</span> <span class="date-chip">2024-05-15</span> <span class="date-chip">2024-05-20</span> <span class="date-chip">2024-05-25</span> </div> </div> </div> <script> // 初始高亮日期数组 let highlightedDates = [ '2024-05-01', '2024-05-15', '2024-05-20', '2024-05-25' ]; // 当前显示的日期 let currentDate = new Date(); // DOM元素 const calendarDays = document.getElementById('calendar-days'); const monthYearElement = document.getElementById('current-month-year'); const prevMonthBtn = document.getElementById('prev-month'); const nextMonthBtn = document.getElementById('next-month'); const dateInput = document.getElementById('date-input'); const addBtn = document.getElementById('add-btn'); const highlightedList = document.getElementById('highlighted-list'); // 月份名称 const monthNames = [ '月', '二月', '三月', '四月', '五月', '六月', '七月', '八月', '九月', '十月', '十月', '十二月' ]; // 渲染日历 function renderCalendar() { // 清除现有日期 calendarDays.innerHTML = ''; // 设置标题 monthYearElement.textContent = `${monthNames[currentDate.getMonth()]} ${currentDate.getFullYear()}`; // 获取当前月份的第天 const firstDay = new Date(currentDate.getFullYear(), currentDate.getMonth(), 1); // 获取当前月份的最后天 const lastDay = new Date(currentDate.getFullYear(), currentDate.getMonth() + 1, 0); // 确定当前月份的第天是星期几(0=周日,1=周,...,6=周六) let firstDayIndex = firstDay.getDay(); // 调整:将周日(0)转换为7,周(1)转换为1,以此类推 firstDayIndex = firstDayIndex === 0 ? 7 : firstDayIndex; // 计算需要显示的上个月的天数 const prevLastDay = new Date(currentDate.getFullYear(), currentDate.getMonth(), 0).getDate(); // 计算需要显示的下个月的天数 const nextDays = 7 - (lastDay.getDate() + (firstDayIndex - 1)) % 7; // 上个月的天数 for (let i = prevLastDay - (firstDayIndex - 2); i <= prevLastDay; i++) { const dayElement = document.createElement('div'); dayElement.classList.add('day', 'other-month'); dayElement.textContent = i; calendarDays.appendChild(dayElement); } // 当月天数 for (let i = 1; i <= lastDay.getDate(); i++) { const dayElement = document.createElement('div'); dayElement.classList.add('day'); dayElement.textContent = i; // 构建完整日期字符串 (YYYY-MM-DD) const dateStr = `${currentDate.getFullYear()}-${String(currentDate.getMonth() + 1).padStart(2, '0')}-${String(i).padStart(2, '0')}`; // 检查日期是否在高亮数组中 if (highlightedDates.includes(dateStr)) { dayElement.classList.add('highlighted'); } calendarDays.appendChild(dayElement); } // 下个月的天数 for (let i = 1; i <= nextDays; i++) { const dayElement = document.createElement('div'); dayElement.classList.add('day', 'other-month'); dayElement.textContent = i; calendarDays.appendChild(dayElement); } updateHighlightedList(); } // 更新高亮日期列表显示 function updateHighlightedList() { highlightedList.innerHTML = ''; highlightedDates.forEach(date => { const chip = document.createElement('span'); chip.classList.add('date-chip'); chip.textContent = date; highlightedList.appendChild(chip); }); } // 上个月按钮事件 prevMonthBtn.addEventListener('click', () => { currentDate.setMonth(currentDate.getMonth() - 1); renderCalendar(); }); // 下个月按钮事件 nextMonthBtn.addEventListener('click', () => { currentDate.setMonth(currentDate.getMonth() + 1); renderCalendar(); }); // 添高亮日期 addBtn.addEventListener('click', () => { const selectedDate = dateInput.value; if (selectedDate && !highlightedDates.includes(selectedDate)) { highlightedDates.push(selectedDate); renderCalendar(); } }); // 初始渲染 renderCalendar(); </script> </body> </html> ``` ## 代码解释 1. **数据结构** - `highlightedDates`数组存储需要高亮显示的日期字符串(格式为YYYY-MM-DD) - `currentDate`存储当前显示的月份和年份 2. **日历渲染逻辑** - `renderCalendar()`函数负责生成日历网格 - 计算当前月份的第天和最后- 填充上个月的天数(灰色显示) - 填充当前月的天数,检查是否在高亮数组- 填充下个月的天数(灰色显示) 3. **高亮日期判断** - 为每个日期单元格生成对应的YYYY-MM-DD格式字符串 - 使用`Array.includes()`方法检查日期是否在`highlightedDates`数组- 如果是高亮日期,添`highlighted`类应用特殊样式 4. **日期操作** - 使用JavaScript的Date对象处理日期计算 - 月份切换通过`setMonth()`方法实现 - 日期格式化为两位数(如05)使用`padStart(2, '0')` 5. **用户交互** -上/下月切换按钮 - 提供日期选择器添新的高亮日期 - 高亮日期列表实时更新显示 ## 使用说明 1. 初始高亮显示2024年5月的1日、15日、20日和25日 2. 点击左右箭头切换月份 3. 使用日期选择器选择新日期 4. 点击"添高亮日期"按钮将日期入高亮列表 5. 高亮日期会在日历上用特殊样式标记(蓝色背景+橙色圆点)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值