2020年11月28日 第一个只出现一次的字符

本文介绍了一种使用HashMap在字符串中查找第一个仅出现一次的字符的方法,并详细解释了实现过程,包括初始化映射、更新频率和定位目标字符。

题目描述

在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写).(从0开始计数)

思路一:
憨批思路,选择无脑遍历
用hashmap
写了三个循环,第一次循环,建立起键值对的映射关系
第二次循环,将找到重复的键的值进行累加
第三次循环,找出值为1的键,返回对应的索引

import java.util.HashMap;
public class Solution {
    public int FirstNotRepeatingChar(String str) {
        if (str.length()==0||"".equals(str)) {
            return -1;
        }
        int res = -1;
        HashMap hm = new HashMap();
        for(int i=0;i<str.length();i++){
            hm.put(str.charAt(i),0);
        }
        for(int i=0;i<str.length();i++){
            hm.put(str.charAt(i),(Integer)hm.get(str.charAt(i))+1);
        }
        for(int i=0;i<str.length();i++){
           if ((Integer) hm.get(str.charAt(i))==1){
               res = i;
               break;
           }
        }
        return res;
    }
}

这里也算是复习了一下HashMap的一些api
因为老是忘掉
比如简单的取值,设置值,hashmap的遍历,还有关于数据类型的强制转换 需要注意

<think>嗯,用户想不用函数来编写一个期在一中是第几天的程序。首先,我需要理解这个问题的要求。不用函数的话,可能意味着不能直接调用内置的期函数或者库,比如Python中的datetime模块。那只能手动计算了。 那步骤应该是怎样的呢?首先,得获取用户输入的、月、。然后,需要计算从1月到输入月份的前一个月每个月的天数之和,再加上当月的天数。关键在于处理闰的二月天数,闰判断条件是能被4整除但不能被100整除,或者能被400整除。 比如,用户输入20243月1,2024是闰,所以二月有29天。计算前两个月(1月和2月)的天数总和,再加1天,就是31 + 29 +1 = 61天,也就是第61天。 那具体怎么实现呢?首先,输入,可能需要用split分割字符串。然后,需要将月份转换为整数,因为要循环到前一个月。比如月份是3月,就要累加1月和2月的天数。 接下来处理每个月的天数。平和闰的二月天数不同,所以需要先判断是否是闰。可以用条件判断,比如份能被4整除但不能被100整除,或者能被400整除,则是闰,二月29天,否则28天。 然后,创建一个月份天数的列表。比如,非闰的话,是[31,28,31,30,...],闰则是二月改为29天。不过,可能更高效的方式是在循环中判断是否是二月,并且是否是闰。或者,先创建一个列表,根据闰情况调整二月的天数。 比如,先初始化一个列表months_days = [31,28,31,30,...],然后如果是闰,就把months_days[1]改为29。然后,累加前month-1个月的天数总和,加上当月的天数。 那具体的代码结构应该是怎样的呢?比如,输入一个字符串,比如"2024-03-01",然后分割成year, month, day。注意转换数据类型为整数。然后判断是否是闰,调整二月的天数。然后计算前面几个月的总天数,再加上day。 比如代码步骤: 1. 输入期,按“-”分割得到、月、。 2. 转换为整数。 3. 判断闰。 4. 创建各月份天数列表,如果是闰,二月改为29天。 5. 计算前month-1个月的天数总和。 6. 总和加上day,得到结果。 那需要处理错误情况吗?比如用户输入2月30,这样的无效期。但题目可能假设输入是合法的,所以暂时不考虑校验。 测试一下,比如输入2020-03-01,闰,总天数是31(1月) +29(2月) +1=61天。正确。如果是平,比如2021-03-01,则是31+28+1=60天。 那代码的大体结构应该是这样的: date_str = input("请输入期(格式:YYYY-MM-DD):") year, month, day = map(int, date_str.split('-')) # 判断闰 is_leap = (year %4 ==0 and year%100 !=0) or (year%400 ==0) months_days = [31,28,31,30,31,30,31,31,30,31,30,31] if is_leap: months_days[1] =29 total = sum(months_days[:month-1]) + day print(total) 这样就完成了。不用任何函数的话,可能sum函数也是内置函数,但题目可能允许,因为用户指的是不自己定义函数,或者不使用期处理函数。可能需要确认,但通常sum是可以使用的。这样代码是可行的。</think>要计算一个期在一中是第几天,可以通过以下步骤手动实现(不使用期函数): ### 步骤分析 1. **输入处理**:获取、月、。 2. **闰判断**:根据份判断是否为闰(二月天数不同)。 3. **月份天数表**:列出每个月的天数,并根据闰调整二月天数。 4. **累加天数**:累加前几个月的天数,再加上当前月的天数。 --- ### 实现代码 ```python date_str = input("请输入期(格式:YYYY-MM-DD):") year, month, day = map(int, date_str.split('-')) # 判断闰 is_leap = (year % 4 == 0 and year % 100 != 0) or (year % 400 == 0) # 定义各月份天数 months_days = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31] if is_leap: months_days[1] = 29 # 闰二月改为29天 # 计算总天数 total_days = sum(months_days[:month-1]) + day print(f"这一天是{year}的第{total_days}天") ``` --- ### 关键逻辑解释 1. **闰规则**: - 能被4整除但不能被100整除,或能被400整除的份为闰。 - 例如:2000是闰,1900不是闰。 2. **月份天数表**: - 平:$$[31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]$$ - 闰:将二月天数改为29。 3. **累加计算**: - 若输入月份为3月(month=3),则累加1月和2月的天数。 - 公式:$$ \text{总天数} = \sum_{i=1}^{\text{month}-1} \text{months\_days}[i-1] + \text{day} $$ --- ### 示例验证 输入 `2024-03-01`: 1. 2024是闰,二月有29天。 2. 前两个月天数总和:$$31 + 29 = 60$$ 3. 总天数:$$60 + 1 = 61$$ 输出:`这一天是2024的第61天`。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值