141、长按键入

题目描述:
你的朋友正在使用键盘输入他的名字 name。偶尔,在键入字符 c 时,按键可能会被长按,而字符可能被输入 1 次或多次。

你将会检查键盘输入的字符 typed。如果它对应的可能是你的朋友的名字(其中一些字符可能被长按),那么就返回 True。

示例 1:

输入:name = “alex”, typed = “aaleex”
输出:true
解释:‘alex’ 中的 ‘a’ 和 ‘e’ 被长按。
示例 2:

输入:name = “saeed”, typed = “ssaaedd”
输出:false
解释:‘e’ 一定需要被键入两次,但在 typed 的输出中不是这样。
示例 3:

输入:name = “leelee”, typed = “lleeelee”
输出:true
示例 4:

输入:name = “laiden”, typed = “laiden”
输出:true
解释:长按名字中的字符并不是必要的。

提示:

name.length <= 1000
typed.length <= 1000
name 和 typed 的字符都是小写字母。

直接放入代码

if(i != name.length() ){
			return false;
		}else {
			while (j < typed.length()-1) {
				if(typed.charAt(j) != typed.charAt(j+1)){
					return false;
				}
				
			}
			return true;
		}
		

在这里插入图片描述

排名靠前的代码

  char[] type = typed.toCharArray();
        char[] nam = name.toCharArray();
        int indexName = 0;
        for (int i = 0; i < type.length; i++) {
            if (indexName < nam.length && type[i] == nam[indexName]) {
                indexName++;
            } else if (indexName > 0 && type[i] == nam[indexName - 1]) {

            } else {
                return false;
            }
        }
        return indexName == name.length();
### 51单片机按的单击、双击和按实现方法 对于51单片机而言,在处理按事件时,通过定时器来检测按状态的变化可以有效地区分单击、双击以及按操作。具体来说: #### 定义时间阈值 为了区分不同的点击模式,定义两个主要的时间阈值:一个是用于判断短按时限(通常设为0.5秒),另一个则是用来确认按动作的发生时限(一般设定大于等于1秒钟)。当按被按下后的持续时间内未达到按标准但已释放,则会进一步检查这段时间内的点击次数以决定是单次还是两次快速点击。 #### 检测逻辑流程 一旦检测到有键入信号发生,即启动一个计时过程并开始监测该按钮的状态变化情况。如果在这个预设时间段内(比如小于0.5秒)再次接收到相同的输入信号,则视为一次新的点击尝试;反之则认为是一般的短暂触碰或是误触发而忽略不计。特别地,若经过了一定周期之后仍然保持闭合状态,则会被认定为时间持有行为——也就是所谓的“按”。 #### C语言代码示例 下面给出一段简单的C程序片段作为例子说明如何利用上述思路编写适用于8051架构微控制器上的软件部分[^1]。 ```c #include <reg52.h> #define KEY_PORT P3 // 假设按连接到了P3口上 unsigned char key_state = 0; bit is_long_press = 0; void delay(unsigned int ms){ unsigned int i,j; for(i=ms;i>0;i--) for(j=114;j>0;j--); } // 初始化函数 void init(){ TMOD = 0x01; // 设置T0工作于方式1(16位自动重装载) TH0=(65536-500)/256; // 设定初值使定时中断每过约500us产生一次 TL0=(65536-500)%256; EA=1; // 开启全局中断允许标志EA ET0=1; // 启动定时/计数器0溢出中断ET0 TR0=1; // 启动定时器0运行TR0 } // 中断服务子程序 void timer0() interrupt 1 { static unsigned short count = 0; TH0=(65536-500)/256; TL0=(65536-500)%256; if(KEY_PORT == 0){ // 如果按处于低电平表示已被按下 ++count; if(count >= 200 && !is_long_press){ // 超过1000毫秒判定为按 is_long_press = 1; while(!KEY_PORT); // 等待按弹起 count = 0; } } else { // 当按抬起时进行下一步判断 if(is_long_press){ // 执行按对应的操作... is_long_press = 0; } else if (count > 0 && count < 200) { // 小于1000毫秒且大于零的情况考虑是否构成双击条件 switch(key_state){ case 0: // 这里执行首次点击响应... key_state++; break; case 1: if((TH0*256+TL0)*2<750){ // 若第二次点击间隔不超过750毫秒则视作双击 // 处理双击事件... key_state = 0; } else{ // 单独的一次点击... key_state = 0; } break; default : ; } count = 0; } } } ``` 这段代码展示了基本框架下的按扫描机制及其相应的延时处理策略。实际应用中可能还需要根据具体的硬件配置调整参数设置,并加入去抖动措施确保读取准确性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值