500. Keyboard Row

Input: [“Hello”, “Alaska”, “Dad”, “Peace”]
Output: [“Alaska”, “Dad”]
题目要求:如果一个词语的字母来自同排,则输出
不学C++都不行啊,还是C++比较方便

class Solution {
public:
    vector<string> findWords(vector<string>& words) {  
        std::unordered_set <char> row1={'q','w','e','r','t','y','u','i','o','p'};  
        std::unordered_set <char> row2={'a','s','d','f','g','h','j','k','l'};  
        std::unordered_set <char> row3={'z','x','c','v','b','n','m'};  
        vector<string> out;  
        for(auto &elem : words)  
        {  
            bool d1=true,d2=true,d3=true;  
            for(auto &key :elem)  
            {  
                if(d1)  
                {  
                    auto re=row1.find(tolower(key));  
                    if(re==row1.end())  
                        d1=false;  
                }  
                if(d2)  
                {  
                    auto re=row2.find(tolower(key));  
                    if(re==row2.end())  
                        d2=false;  
                }  
                if(d3)  
                {  
                    auto re=row3.find(tolower(key));  
                    if(re==row3.end())  
                        d3=false;  
                }  

            }  
            if(d1||d2||d3)  
                out.push_back(elem);  
        }  

        return out;  
    }

1.vector用法
1.1使用前提:

#include<vector>
using namespace std;

1.2基本功能:C++中的一种数据结构和一种类,相当于动态数组。用于无法得知数组规模的情况。

vector<int> a;//一维数组
vector<vector<int>> a;//二维数组
vector<string> a;//(如题)连续的一个一个字符串
a.push_back(x);//在数组的最后添加一个数据x
a.pop_back();//去掉数组的最后一个数据 
a.at(index);//得到编号index位置的数据
a.begin();//得到数组头的指针
a.end();//得到数组的最后一个单元+1的指针
a.front();//得到数组头的引用
a.back();//得到数组的最后一个单元的引用
a.max_size();//当前能申请到的大小
a.capacity();//当前vector分配的大小
a.size();//当前使用数据的大小
a.resize(num);//改变当前使用数据的大小
a.reserve(num);//强制容器把它的容量改为至少num,提供的num不小于当前大小。这一般强迫进行一次重新分配,因为容量需要增加
a.erase(iter);//删除指针指向的数据项,如下方法删除值为3的元素避免野指针
for(vector<int>::iterator iter=a.begin(); iter!=a.end();)
{
     if( *iter == 3)
          iter = a.erase(iter);
      else
            a ++ ;
}
a.clear;//空当前的vector
a.rbegin();//将vector反转后的开始指针返回(其实就是原来的end-1)
a.rend();//将vector反转构的结束指针返回(其实就是原来的begin-1)
a.empty();//判断vector是否为空,返回bool
a.swap(vector<int> b)//与vector<int> b交换数据
{
   std::vector<int> tmp = a;   
   a.swap(tmp);
}或者vector<int>(a).swap(a);//加大括号了,tmp在结束时自动析构

2.iterator用法
2.1定义:每种容器类型都有自己的迭代器类型。例如vector::iterator iter;这条语句定义了一个名为iter的变量,它的数据类型是由vector定义的iterator类型。
2.2vector::const_iterator 和 const vector::iterator的区别,后者类型可以通过*iter=2等表达式修改值,前者不行。
2.3遍历一个vector

for(vector<int>::iterator iter=ivec.begin();iter!=ivec.end();++iter)
{
    ......
}

3.tolower用法:char tolower(char);

#include <stdlib.h>或者
#include <ctype.h>

4.unordered_set:无序集合容器(unordered_set)是一个存储无重复的关联容器,容器中的元素无特别的秩序关系,该容器允许基于值的快速元素检索,同时也支持正向迭代。 在一个unordered_set内部,元素不会按任何顺序排序,而是通过元素值的hash值将元素分组放置到各个槽(Bucker,也可以译为“桶”),这样就能通过元素值快速访问各个对应的元素(均摊耗时为O(1))
5.find用法:

#include <algorithm> 
find(m.begin, m.end(), "hello")
//find(查找起始地址,查找结束地址的下一位地址,查找的字符串);
//返回找到的下标,找不到则返回m.end().

6.auto:从初始化表达式中推断出变量的数据类型。通过auto的自动类型推断,大大简化编程工作.
7.for的简单变量循环

for(auto &elem :words)
//for(元素类型 &给元素取的名字 :数组的名字)
检测鼠标事件 def mouse_event(self, event, x, y, flags, param): if event == cv2.EVENT_LBUTTONUP and x > 550 and y < 50: def open_login_window(my_window, on_entry_click): loginwindow = LoginWindow(on_entry_click) loginwindow.transient(my_window) loginwindow.wait_visibility() loginwindow.grab_set() def quit_window(my_window): # self.camera_process.terminate() my_window.destroy() # 虚拟键盘 def on_entry_click(self, event, entry): if self.keyboard_window: self.keyboard_window.destroy() keyboard_window = tk.Toplevel(self) keyboard_window.title("虚拟键盘") keyboard_window.geometry("610x140") keyboard_window.resizable(False, False) button_list = ['1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '<-', 'q', 'w', 'e', 'r', 't', 'y', 'u', 'i', 'o', 'p', 'a', 's', 'd', 'f', 'g', 'h', 'j', 'k', 'l', 'z', 'x', 'c', 'v', 'b', 'n', 'm'] row = 0 col = 0 for button_text in button_list: button = tk.Button(keyboard_window, text=button_text, width=3) if button_text != '<-': button.config(command=lambda char=button_text: entry.insert(tk.END, char)) else: button.config( command=lambda char=button_text: entry.delete(len(entry.get()) - 1, tk.END)) button.grid(row=row, column=col) col += 1 if col > 10: row += 1 col = 0 keyboard_window.deiconify() self.keyboard_window = keyboard_window # 登录界面 my_window = tk.Tk() my_window.title("登录") my_window.geometry("300x200") # 计算窗口位置,让其出现在屏幕中间 screen_width = my_window.winfo_screenwidth() screen_height = my_window.winfo_screenheight() x = (screen_width - 300) // 2 y = (screen_height - 200) // 2 my_window.geometry("+{}+{}".format(x, y)) my_window.wm_attributes("-topmost", True) login_button = tk.Button(my_window, text="登录", font=('Arial', 12), width=10, height=1, command=lambda: open_login_window(my_window, on_entry_click)) login_button.pack(side='left', expand=True) exitbutton = tk.Button(my_window, text="退出", font=('Arial', 12), width=10, height=1, command=lambda: [quit_window(my_window)]) exitbutton.pack(side='left', expand=True) my_window.mainloop() if event == cv2.EVENT_LBUTTONUP and x < 50 and y > 1000: cv2.destroyAllWindows() 在此基础上请实现让tk界面不会出现重影 用中文回答
06-02
在实现让 Tkinter 界面不出现重影的方法前,需要先了解 Tkinter 的内部机制。Tkinter 的主循环是基于事件驱动的,它会不断地监听用户的事件(比如鼠标点击、键盘输入等),并根据事件类型来执行相应的操作。当 Tkinter 界面需要更新时,主循环会自动调用界面的重绘函数来更新界面。 如果我们在 OpenCV 的 mouse_event 函数中直接调用 Tkinter 界面的函数,就会导致界面的重绘函数被频繁地调用,从而出现重影。为了避免这种情况的发生,可以将 Tkinter 界面的更新操作放到单独的线程中进行,这样就不会影响主循环的执行。 下面是一个示例代码,演示了如何使用多线程来更新 Tkinter 界面: ```python import cv2 import threading import tkinter as tk class GUI: def __init__(self): self.root = tk.Tk() self.label = tk.Label(self.root, text='Hello, world!') self.label.pack() self.thread = threading.Thread(target=self.update_gui) self.thread.start() def update_gui(self): while True: # 更新界面 self.label.config(text=str(time.time())) # 休眠一段时间,避免过于频繁地更新界面 time.sleep(0.1) def run(self): self.root.mainloop() def main(): gui = GUI() gui.run() if __name__ == '__main__': main() ``` 在这个示例代码中,我们创建了一个 GUI 类,其中包含一个 Tkinter Label 控件和一个线程 thread。在线程 thread 中,我们使用 Label 的 config 方法来更新界面,并使用 time.sleep 方法来控制界面刷新的频率。在主程序中,我们创建了一个 GUI 对象,并调用其 run 方法来启动 Tkinter 主循环。 如果需要在 OpenCV 的 mouse_event 函数中更新 Tkinter 界面,只需要将相应的更新操作放到 GUI 类的 update_gui 方法中即可。在 mouse_event 函数中,我们可以使用 threading.Thread 类来创建一个新的线程,然后将 update_gui 方法作为线程的目标函数。这样,当鼠标事件发生时,就会启动一个新的线程来更新 Tkinter 界面,避免了界面重影的问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值