Day38=====

Python实现:仅反转字符串中的英文字母

917. 仅仅反转字母

给你一个字符串 s ,根据下述规则反转字符串:

  • 所有非英文字母保留在原有位置。
  • 所有英文字母(小写或大写)位置反转。

返回反转后的 s

 双指针往往使用while循环

翻转最重要的细节就是什么时候停止翻转!——————while(i<j){ ---进行翻转---}

class Solution {
    public String reverseOnlyLetters(String s) {
        char ch[] = s.toCharArray();
        int j = ch.length - 1;
        int i=0;
        while(i<j){
            if(!Character.isLetter(ch[i])){
                i++;
            }
            if(!Character.isLetter(ch[j])){
                j--;
            }
            if(Character.isLetter(ch[i])&&Character.isLetter(ch[j])){
                char temp=ch[i];
                ch[i]=ch[j];
                ch[j]=temp;
                i++;
                j--;
            }
        }
        return new String(ch);
    }
}

#include <reg51.h> #include <intrins.h> #define uchar unsigned char #define uint unsigned int // ---------------------- ????(????:???????) ---------------------- // LCD???? sbit LCD_RS = P2^5; sbit LCD_RW = P2^6; sbit LCD_E = P2^7; // ???? sbit K1 = P3^0; // ????? sbit K2 = P3^1; // ???? sbit K3 = P3^2; // ???? sbit K4 = P3^3; // ??/?? sbit K5 = P3^4; // ????(??) sbit K6 = P3^5; // ??????(??) // ??????(??:???????,????????????1,???????0) sbit BUZZER = P2^0; // ????1:??????(??????,????????1,??????0) sbit LED = P2^4; // LED???? sbit DS18B20_DQ = P3^7; // DS18B20???? // ---------------------- ???? ---------------------- uchar year = 24, month = 5, day = 31; uchar hour = 23, minute = 59, second = 0; uchar week = 5; uchar alarmHour = 8, alarmMinute = 0; bit alarmFlag = 1; bit hourFlag = 0; // ???????? bit adjustFlag = 0; uchar adjustIndex = 0; uint adjustTimer = 0; float temperature = 0; uchar tempHigh = 30, tempLow = 20; bit tempValid = 0; // ???????? uchar displayBuf[17]; uchar code weekStr[8][4] = {"", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"}; // ---------------------- ??????(??:???????) ---------------------- void delay_ms(uint ms) { uint i, j; for (i = 0; i < ms; i++) { for (j = 0; j < 110; j++); // 11.0592MHz?˜1ms } } void delay_us(uchar us) { while (us--) { _nop_(); // 11.0592MHz?˜0.089us,12?˜1us } } // ????2:?????(????????,??????????) void buzzer_short_beep() { BUZZER = 1; // ??(?????????0) delay_ms(100); BUZZER = 0; // ??(?????????1) } // ????3:?????(????/????) void buzzer_long_beep() { BUZZER = 1; // ??(?????????0) delay_ms(200); BUZZER = 0; // ??(?????????1) delay_ms(200); } // ---------------------- LCD1602???? ---------------------- void write_cmd(uchar cmd) { LCD_RS = 0; LCD_RW = 0; LCD_E = 1; P0 = cmd; delay_us(12); LCD_E = 0; delay_ms(1); } void write_data(uchar dat) { LCD_RS = 1; LCD_RW = 0; LCD_E = 1; P0 = dat; delay_us(12); LCD_E = 0; delay_ms(1); } void init_lcd() { delay_ms(15); write_cmd(0x38); // 8????2????5×7?? write_cmd(0x0C); // ??????? write_cmd(0x06); // ?????????? write_cmd(0x01); // ?? delay_ms(2); } void set_lcd_pos(uchar pos) { write_cmd(pos | 0x80); } void display_string(uchar pos, uchar *str) { set_lcd_pos(pos); while (*str) { write_data(*str++); } } // ---------------------- DS18B20??(??:????) ---------------------- // ????4:??DS18B20????,????? bit ds18b20_reset() { bit ack; uchar retry = 3; while (retry--) { DS18B20_DQ = 0; delay_us(700); // ?????????,??????(?750us) DS18B20_DQ = 1; delay_us(30); // ????????(?15us),???? ack = DS18B20_DQ; delay_us(70); if (!ack) break; // ?????(0)??? } return ack; // ??1=??,0=?? } void ds18b20_write_byte(uchar dat) { uchar i; for (i = 0; i < 8; i++) { DS18B20_DQ = 0; _nop_();_nop_(); DS18B20_DQ = dat & 0x01; delay_us(60); DS18B20_DQ = 1; dat >>= 1; } } uchar ds18b20_read_byte() { uchar i, dat = 0; for (i = 0; i < 8; i++) { DS18B20_DQ = 0; _nop_();_nop_(); DS18B20_DQ = 1; _nop_();_nop_(); dat >>= 1; if (DS18B20_DQ) dat |= 0x80; delay_us(60); } return dat; } float read_temperature() { uchar tempL, tempH; float temp; tempValid = 0; // ?????? if (!ds18b20_reset()) { // ??????? ds18b20_write_byte(0xCC); // ??ROM ds18b20_write_byte(0x44); // ?????? delay_ms(750); // ??????(??) ds18b20_reset(); ds18b20_write_byte(0xCC); ds18b20_write_byte(0xBE); // ????? tempL = ds18b20_read_byte(); // ?8? tempH = ds18b20_read_byte(); // ?8? // ?????????(?????) if ((tempH & 0xF8) == 0x00 || (tempH & 0xF8) == 0xF8) { temp = (tempH << 8) | tempL; temp *= 0.0625; // ???????(1LSB=0.0625?) tempValid = 1; // ?????? return temp; } } return -99.9; // ??????? } // ---------------------- ?????? ---------------------- void time_add() { static uint sec_cnt = 0; if (adjustFlag) return; // ????????? sec_cnt++; if (sec_cnt >= 5) { // 5?200ms=1? sec_cnt = 0; second++; if (second >= 60) { second = 0; minute++; if (minute >= 60) { minute = 0; hour++; hourFlag = 1; // ?????? if (hour >= 24) { hour = 0; day++; week++; if (week > 7) week = 1; // ?????? if ((month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12) && day > 31) { day = 1; month++; } else if ((month == 4 || month == 6 || month == 9 || month == 11) && day > 30) { day = 1; month++; } else if (month == 2) { if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) { if (day > 29) { day = 1; month++; } } else { if (day > 28) { day = 1; month++; } } } if (month > 12) { month = 1; year++; if (year >= 100) year = 0; } } } } } } // ---------------------- ?????? ---------------------- void key_process() { #define KEY_DEBOUNCE 20 if (!K1) { delay_ms(KEY_DEBOUNCE); if (!K1) { while (!K1); adjustFlag = 1; adjustIndex++; if (adjustIndex > 9) adjustIndex = 1; adjustTimer = 0; write_cmd(0x0F); // ????? } } if (adjustFlag && !K2) { delay_ms(KEY_DEBOUNCE); if (!K2) { while (!K2); adjustTimer = 0; switch (adjustIndex) { case 1: hour = (hour + 1) % 24; break; case 2: minute = (minute + 1) % 60; break; case 3: second = 0; break; case 4: year = (year + 1) % 100; break; case 5: month = (month % 12) + 1; break; case 6: if ((month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12)) { day = (day % 31) + 1; } else if ((month == 4 || month == 6 || month == 9 || month == 11)) { day = (day % 30) + 1; } else if (month == 2) { if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) { day = (day % 29) + 1; } else { day = (day % 28) + 1; } } break; case 7: week = (week % 7) + 1; break; case 8: alarmHour = (alarmHour + 1) % 24; break; case 9: alarmMinute = (alarmMinute + 1) % 60; break; } } } if (adjustFlag && !K3) { delay_ms(KEY_DEBOUNCE); if (!K3) { while (!K3); adjustTimer = 0; switch (adjustIndex) { case 1: hour = (hour == 0) ? 23 : hour - 1; break; case 2: minute = (minute == 0) ? 59 : minute - 1; break; case 3: second = 0; break; case 4: year = (year == 0) ? 99 : year - 1; break; case 5: month = (month == 1) ? 12 : month - 1; break; case 6: if ((month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12)) { day = (day == 1) ? 31 : day - 1; } else if ((month == 4 || month == 6 || month == 9 || month == 11)) { day = (day == 1) ? 30 : day - 1; } else if (month == 2) { if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) { day = (day == 1) ? 29 : day - 1; } else { day = (day == 1) ? 28 : day - 1; } } break; case 7: week = (week == 1) ? 7 : week - 1; break; case 8: alarmHour = (alarmHour == 0) ? 23 : alarmHour - 1; break; case 9: alarmMinute = (alarmMinute == 0) ? 59 : alarmMinute - 1; break; } } } if (!K4) { delay_ms(KEY_DEBOUNCE); if (!K4) { while (!K4); adjustFlag = 0; adjustIndex = 0; write_cmd(0x0C); // ??? alarmFlag = 1; } } if (adjustFlag) { adjustTimer++; if (adjustTimer >= 25) { adjustFlag = 0; adjustIndex = 0; write_cmd(0x0C); } } else { adjustTimer = 0; } } // ---------------------- ????(??:????????) ---------------------- void alarm_alarm() { if (alarmFlag && hour == alarmHour && minute == alarmMinute && second < 10) { buzzer_long_beep(); LED = 0; } else { LED = 1; } } void temp_alarm() { if (!adjustFlag && tempValid && !(alarmFlag && hour == alarmHour && minute == alarmMinute && second < 10)) { if (temperature > tempHigh || temperature < tempLow) { buzzer_long_beep(); LED = 0; }else { LED = 1; } } } // ????5:??????i,???????? void hour_alarm() { uchar i; // ??:???????? if (hourFlag && !(alarmFlag && hour == alarmHour && minute == alarmMinute && second < 10) && !(tempValid && (temperature > tempHigh || temperature < tempLow))) { // ??????:6-22??12?????,????1? uchar beepCnt = (hour >= 6 && hour <= 22) ? hour % 12 : 1; if (beepCnt == 0) beepCnt = 12; // 12????? // ???? for (i = 0; i < beepCnt; i++) { buzzer_short_beep(); delay_ms(300); } hourFlag = 0; // ????,?????? LED = 1; } } // ---------------------- LCD????(????:??????) ---------------------- void refresh_display() { // ???:??? + ?? displayBuf[0] = hour / 10 + '0'; displayBuf[1] = hour % 10 + '0'; displayBuf[2] = ':'; displayBuf[3] = minute / 10 + '0'; displayBuf[4] = minute % 10 + '0'; displayBuf[5] = ':'; displayBuf[6] = second / 10 + '0'; displayBuf[7] = second % 10 + '0'; displayBuf[8] = ' '; displayBuf[9] = 'W'; displayBuf[10] = 'e'; displayBuf[11] = 'e'; displayBuf[12] = 'k'; displayBuf[13] = ':'; displayBuf[14] = weekStr[week][0]; displayBuf[15] = weekStr[week][1]; displayBuf[16] = weekStr[week][2]; display_string(0x00, displayBuf); // ???:??? + ??(????6:??????,??????) displayBuf[0] = '2'; displayBuf[1] = '0'; displayBuf[2] = year / 10 + '0'; displayBuf[3] = year % 10 + '0'; displayBuf[4] = '-'; displayBuf[5] = month / 10 + '0'; displayBuf[6] = month % 10 + '0'; displayBuf[7] = '-'; displayBuf[8] = day / 10 + '0'; displayBuf[9] = day % 10 + '0'; displayBuf[10] = ' '; displayBuf[11] = 'T'; displayBuf[12] = ':'; // ????:????????,???????? if (tempValid) { if (temperature < 0) { displayBuf[13] = '-'; // ?? displayBuf[14] = (uchar)(-temperature) / 10 + '0'; // ?? displayBuf[15] = (uchar)(-temperature) % 10 + '0'; // ?? displayBuf[16] = '.'; // ???(????) } else { displayBuf[13] = (uchar)temperature / 10 + '0'; // ?? displayBuf[14] = (uchar)temperature % 10 + '0'; // ?? displayBuf[15] = '.'; // ??? displayBuf[16] = (uchar)(temperature * 10) % 10 + '0'; // ??? } } else { // ???????"--.-" displayBuf[13] = '-'; displayBuf[14] = '-'; displayBuf[15] = '.'; displayBuf[16] = '-'; } display_string(0x40, displayBuf); // ???????(??:???????????) set_lcd_pos(0x4F); // ??????? write_data(0xDF); // ?????(??????) write_data('C'); // ??"?"?? // ???????? if (adjustFlag) { switch (adjustIndex) { case 1: set_lcd_pos(0x00); break; // ?? case 2: set_lcd_pos(0x03); break; // ?? case 3: set_lcd_pos(0x06); break; // ?? case 4: set_lcd_pos(0x42); break; // ?? case 5: set_lcd_pos(0x45); break; // ?? case 6: set_lcd_pos(0x48); break; // ?? case 7: set_lcd_pos(0x0E); break; // ?? case 8: set_lcd_pos(0x0A); break; // ??? case 9: set_lcd_pos(0x0D); break; // ??? } } } // ---------------------- ???(??:???????) ---------------------- void main() { uint tempCounter = 0; init_lcd(); // ????7:?????????????(????????0,??????1) BUZZER = 0; LED = 1; tempValid = 0; // ???? display_string(0x00, "System Ready..."); delay_ms(1000); write_cmd(0x01); // ?? while (1) { time_add(); // ???? // ?2???????(10*200ms=2?) if (tempCounter >= 10) { temperature = read_temperature(); tempCounter = 0; } else { tempCounter++; } key_process(); // ???? refresh_display(); // ???? // ????8:????????,??????? if (alarmFlag && hour == alarmHour && minute == alarmMinute && second < 10) { alarm_alarm(); // ??(?????) } else if (tempValid && (temperature > tempHigh || temperature < tempLow)) { temp_alarm(); // ????(????) } else if (hourFlag) { hour_alarm(); // ????(?????) } else { LED = 1; // ??????LED } delay_ms(200); // ????? } } 帮我稍微修改这段代码,使其温度显示出来,闹钟,整点报时,温度超过阀值蜂鸣器发声
最新发布
09-02
要实现温度显示、闹钟、整点报时和温度超阈值蜂鸣器发声功能,以下是一个基于常见 51 单片机的示例代码框架,假设使用 DHT11 传感器测量温度,LCD1602 显示温度,蜂鸣器用于报警。 ```c #include <reg51.h> #include <intrins.h> // 定义 LCD1602 引脚 sbit LCD_RS = P2^0; sbit LCD_RW = P2^1; sbit LCD_E = P2^2; // 定义 DHT11 引脚 sbit DHT11 = P3^2; // 定义蜂鸣器引脚 sbit Buzzer = P3^7; // 定义温度阈值 #define TEMP_THRESHOLD 30 // 延时函数 void delay(unsigned int time) { unsigned int i, j; for(i = 0; i < time; i++) for(j = 0; j < 1275; j++); } // LCD1602 写命令 void LCD_WriteCommand(unsigned char command) { LCD_RS = 0; LCD_RW = 0; P0 = command; LCD_E = 1; _nop_(); LCD_E = 0; delay(5); } // LCD1602 写数据 void LCD_WriteData(unsigned char dat) { LCD_RS = 1; LCD_RW = 0; P0 = dat; LCD_E = 1; _nop_(); LCD_E = 0; delay(5); } // LCD1602 初始化 void LCD_Init() { LCD_WriteCommand(0x38); // 8 位数据总线,2 行显示,5x7 点阵 delay(5); LCD_WriteCommand(0x0C); // 显示开,光标关 delay(5); LCD_WriteCommand(0x06); // 文字不动,地址自动加 1 delay(5); LCD_WriteCommand(0x01); // 清屏 delay(5); } // DHT11 开始信号 void DHT11_Start() { DHT11 = 1; delay(1); DHT11 = 0; delay(18); DHT11 = 1; delay(1); } // 检测 DHT11 响应信号 bit DHT11_CheckResponse() { unsigned char time_out = 0; while(DHT11 == 1 && time_out < 100) { time_out++; delay(1); } if(time_out >= 100) return 0; else time_out = 0; while(DHT11 == 0 && time_out < 100) { time_out++; delay(1); } if(time_out >= 100) return 0; return 1; } // 读取 DHT11 一位数据 unsigned char DHT11_ReadBit() { unsigned char time_out = 0; while(DHT11 == 1 && time_out < 100) { time_out++; delay(1); } time_out = 0; while(DHT11 == 0 && time_out < 100) { time_out++; delay(1); } delay(30); if(DHT11 == 1) return 1; else return 0; } // 读取 DHT11 一个字节数据 unsigned char DHT11_ReadByte() { unsigned char i, dat = 0; for(i = 0; i < 8; i++) { dat <<= 1; dat |= DHT11_ReadBit(); } return dat; } // 读取 DHT11 温度数据 unsigned char DHT11_ReadTemperature() { unsigned char humi_int, humi_dec, temp_int, temp_dec, check_sum; DHT11_Start(); if(DHT11_CheckResponse()) { humi_int = DHT11_ReadByte(); humi_dec = DHT11_ReadByte(); temp_int = DHT11_ReadByte(); temp_dec = DHT11_ReadByte(); check_sum = DHT11_ReadByte(); if((humi_int + humi_dec + temp_int + temp_dec) == check_sum) { return temp_int; } } return 0; } // 显示温度 void DisplayTemperature(unsigned char temp) { LCD_WriteCommand(0x80); // 第一行首地址 LCD_WriteData('T'); LCD_WriteData('e'); LCD_WriteData('m'); LCD_WriteData('p'); LCD_WriteData(':'); LCD_WriteData(temp / 10 + '0'); LCD_WriteData(temp % 10 + '0'); LCD_WriteData('C'); } // 蜂鸣器发声 void Buzzer_Beep() { unsigned int i; for(i = 0; i < 1000; i++) { Buzzer = ~Buzzer; delay(1); } } // 主函数 void main() { unsigned char temp; LCD_Init(); while(1) { temp = DHT11_ReadTemperature(); DisplayTemperature(temp); if(temp > TEMP_THRESHOLD) { Buzzer_Beep(); } // 这里可以添加闹钟和整点报时的逻辑 delay(1000); // 每秒更新一次 } } ``` ### 代码说明: 1. **LCD1602 部分**:实现了 LCD1602 的初始化、写命令和写数据的函数,用于显示温度。 2. **DHT11 部分**:实现了 DHT11 的开始信号、响应检测、读位和读字节的函数,用于读取温度数据。 3. **蜂鸣器部分**:实现了蜂鸣器发声的函数,当温度超过阈值时调用。 4. **主函数**:初始化 LCD1602,循环读取温度数据并显示,当温度超过阈值时蜂鸣器发声。 ### 注意事项: - 此代码仅为示例,实际使用时需要根据硬件连接情况调整引脚定义。 - 闹钟和整点报时的逻辑需要根据具体需求添加,可以使用定时器来实现时间的计时。 ### 相关问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值