题目及理解

Given a List of words, return the words that can be typed using letters of alphabet on only one row’s of American keyboard like the image below.

Example 1:

1
2
Input: ["Hello", "Alaska", "Dad", "Peace"]
Output: ["Alaska", "Dad"]

Note:

  • You may use one character in the keyboard more than once.
  • You may assume the input string will only contain letters of alphabet.

理解

水题,题目的意思就是那些单词可以只用一行上的字母来生成.先以单词的第一个字母来确定属于哪一行,然后逐个判断后面的字母是不是这一行的就可以了.

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
class Solution {
public:
vector<string> findWords(vector<string>& words) {
vector<string> corr;
set<char> r1 = {'q','w','e','r','t','y','u','i','o','p'};
set<char> r2 = {'a','s','d','f','g','h','j','k','l'};
set<char> r3 = {'z','x','c','v','b','n','m'};
vector<set<char>> row = {r1,r2,r3};
for (int i=0; i<words.size(); i++){
int rows = 0;
for (int j=0;j<3;j++){
if (row[j].count(tolower(words[i][0])) > 0) rows = j;
continue;
}
corr.push_back(words[i]);
for (int k = 1; k <words[i].size(); k++){
if (row[rows].count(tolower(words[i][k])) == 0){
corr.pop_back();
break;
}
}
}
return corr;
}
};

其他的解法

Discuss里面也有很多很简短的代码的解法,基本上都是用到了正则表达式和过滤的结合,这里贴一个Python版的:

1
2
def findWords(self, words):    
return filter(re.compile('(?i)([qwertyuiop]*|[asdfghjkl]*|[zxcvbnm]*)$').match, words)

一行就解决了这个问题,正则还是强大啊~

接着上一部分,在这个部分主要是添加网页相关的一些内容.
对应的源码也放在了github仓库中mysite-part3

开始

概述

在我们的polls的应用中,我们需要以下的四个视图:

  • Question的index页面—显示最近的问题
  • Question的detail页面—显示一个问题的详细信息,可以投票
  • Question的results页面—显示一个问题的结果
  • 投票功能—能够处理投票信息
    阅读全文 »

开始

这是Writing your first Django app, part 2
接着第一部分的例子继续,在这个部分我们要设置数据库,创建第一个模型并且快速介绍一下django的自动生成的admin管理页面.
自己写的代码也同步在github的仓库里:mysite-part2

数据库设置

现在,打开mysite/settings.py文件,这是一个默认的python模型的设置.
Python默认使用的是SQLite数据库,如果不需要自己配置数据库的话,使用默认的即可.而且SQLite数据库已经在Python的模块里,不需要额外的安装.
这里对于其他数据库的配置不做解释,因为只是入门程序,之后在用到如Mysql的时候会再讲到.
现在只要输入如下的命令就可以生成对应的数据库(第一次使用):
$ python manage.py migrate
看到如下的信息的话,就说明生成完成了:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Operations to perform:  
Apply all migrations: admin, auth, contenttypes, sessions
Running migrations:
Applying contenttypes.0001_initial... OK
Applying auth.0001_initial... OK
Applying admin.0001_initial... OK
Applying admin.0002_logentry_remove_auto_add... OK
Applying contenttypes.0002_remove_content_type_name... OK
Applying auth.0002_alter_permission_name_max_length... OK
Applying auth.0003_alter_user_email_max_length... OK
Applying auth.0004_alter_user_username_opts... OK
Applying auth.0005_alter_user_last_login_null... OK
Applying auth.0006_require_contenttypes_0002... OK
Applying auth.0007_alter_validators_add_error_messages... OK
Applying auth.0008_alter_user_username_max_length... OK
Applying sessions.0001_initial... OK

创建模型

在这个简单的app里,需要创建2个模型,Question和Choice.Question里包含了问题和提问的时间,Choice里包含了选择的文字和投票的信息.
polls/models.py文件里添加如下的信息:

1
2
3
4
5
6
7
8
9
10
11
12
from django.db import models


class Question(models.Model):
question_text = models.CharField(max_length=200)
pub_date = models.DateTimeField('date published')


class Choice(models.Model):
question = models.ForeignKey(Question, on_delete=models.CASCADE)
choice_text = models.CharField(max_length=200)
votes = models.IntegerField(default=0)

对应每一个class都会在数据库中生成对应的表和字段.而在对字段添加属性和限制的时候,使用的是Field类.对于Field的详细信息不做过多的描述.

激活模型

首先需要在settings.py文件里将app导入项目中,在INSTALLED_APPS属性中添加polls.apps.PollsConfig路径即可,如下:

1
2
3
4
5
6
7
8
9
INSTALLED_APPS = [    
'polls.apps.PollsConfig',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
]

接下来就可以在命令行中输入:
$ python manage.py makemigrations polls
当看到如下的信息的时候,就表示正确运行了.

1
2
3
4
5
6
for 'polls':

polls/migrations/0001_initial.py:
- Create model Choice
- Create model Question
- Add field question to choice

接下来就可以在代码中对这2个对象进行操作了,在官方的文档中还介绍了如何在shell中来对数据库进行操作,这里就不写出来了,需要的话在官网可以看到.

注意

在模型中添加__str__() 很重要,这样就不会在读取对象的时候只看到对象的class名了.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
from django.db import models
from django.utils.encoding import python_2_unicode_compatible


class Question(models.Model):
# ...这里是之前已经写好的代码,只需要在后面添加一个str的方法即可
def __str__(self):
return self.question_text


class Choice(models.Model):
# ...这里是之前已经写好的代码,只需要在后面添加一个str的方法即可
def __str__(self):
return self.choice_text

至此,对于简单的数据库模型的操作就可以进行了,在代码中直接使用如:**Question.objects.all()来查询所有的对象,用save()**函数就可以向数据库中插入对象,Django推荐在查询的时候使用filter来进行限定条件的查询,比如:

1
2
Question.objects.filter(id=1)
Question.objects.filter(question_text__startswith='What')

注:__startswith这类的方法是更高级的查询限制的方法,详细的可以查看官方的文档,这里的意思很明显就是,查询question_text字段中以what开头的信息.

介绍Django Admin

这也算是我非常喜欢的一个Django的特性了,对后台管理的操作可以直接使用内置的模块来很简单的生成,简直是快速开发的福音.

创建

只需要下面的一行命令就可以:
$ python manage.py createsuperuser
接下来就会需要你填写Username,Email和password,输入正确之后就打开了Django的admin模块了.
接下来启动服务器,然后在浏览器中输入http://127.0.0.1:8000/admin/就可以访问admin后台了.
图片
进入之后就可以看到如下的页面:
tupian

添加管理模块

在polls/admin.py文件中添加一行代码,就可以把Question这个表添加在admin管理中,简直不要太爽了.

1
2
3
4
from django.contrib import admin
from .models import Question

admin.site.register(Question)

刷新页面之后,就可以在后台页面看到polls app中多了Questions的管理页面:
图片
然后就可以对Question进行操作了~

总结

Django确实非常的方便,在对于简单的页面的开发的时候,确实是很快.特别是类似于admin一样的现成的模块,拿来就可以直接使用.

0%