Leetcode-11-Container-With-Most-Water

Container With Most Water

从两侧开始,每次矮的边界向中间移动。如果两侧相同则随意移动。

  • 求出结果的过程与某个最优解总会有某一刻有相同的某一个边界,但宽度为>=的关系;
  • 如最优为a-b,过程中找到的是c-b,则a>=c;
  • 现在只考虑a>c的情况;反之已经找到最优解,之后如果找到更好的就说明不是最优解;同时可以左右交换以考虑对称的情况;
  • 在这一个边界时,若求出结果这一刻的体积小于这个最优解的时刻,则另一个边界是小于关系,因此会向右移动;
  • 即一定有c<b,否则不会更优;
  • 所以会移动左边界向内,如果不到最优解那里,则肯定还是c’<b,否则比最优解更优。
  • 如果两侧边界相同,则说明更优时两个边界都得增加,否则不会比现在大。

代码:

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
26
class Solution {
public:
int maxArea(vector<int>& height) {
int left = 0, right = height.size() - 1;
int ans = (left < right ? left : right) * (right - left), tempans = 0;
while (left < right) {
if height[left] < height[right] {
int temp = left + 1;
while (height[left] >= height[temp] && temp < right) {
temp++;
}
left = temp;
}
else {
int temp = right - 1;
while (height[right] >= height[temp] && temp > left) {
temp--;
}
right = temp;
}
tempans = (left < right ? left : right) * (right - left);
ans = ans < tempans ? tempans : ans;
}
return ans;
}
};

其实并不需要

MVC模式

MVC模式

MVC 模式代表 Model-View-Controller(模型-视图-控制器) 模式。这种模式用于应用程序的分层开发。

  • Model(模型) - 模型代表一个存取数据的对象。它也可以带有逻辑,在数据变化时更新控制器。
  • View(视图) - 视图代表模型包含的数据的可视化。
  • Controller(控制器) - 控制器作用于模型和视图上。它控制数据流向模型对象,并在数据变化时更新视图。它使视图与模型分离开。

MVC示例

MVC框架模式的优点

  1. 开发人员可以只关注整个结构中的其中某一层;
  2. 可以很容易的用新的实现来替换原有层次的实现;
  3. 可以降低层与层之间的依赖;
  4. 有利于标准化;
  5. 利于各层逻辑的复用。

MVC框架模式的缺点

  1. 增加了系统结构和实现的复杂性。对于简单的界面,严格遵循MVC,使模型、视图与控制器分离,会增加结构的复杂性,并可能产生过多的更新操作,降低运行效率。
  2. 视图与控制器间的过于紧密的连接。视图与控制器是相互分离,但确实联系紧密的部件,视图没有控制器的存在,其应用是很有限的,反之亦然,这样就妨碍了他们的独立重用。
  3. 视图对模型数据的低效率访问。依据模型操作接口的不同,视图可能需要多次调用才能获得足够的显示数据。对未变化数据的不必要的频繁访问,也将损害操作性能。

MVP

在MVC的基础上,又出现了MVP即Model-View-Presenter,Model提供数据,View负责显示,Controller/Presenter负责逻辑的处理。

MVP 是从经典的模式MVC演变而来,它们的基本思想有相通的地方:Controller/Presenter负责逻辑的处理,Model提供数据,View负责显示。作为一种新的模式,MVP与MVC有着一个重大的区别:在MVP中View并不直接使用Model,它们之间的通信是通过Presenter (MVC中的Controller)来进行的,所有的交互都发生在Presenter内部,而在MVC中View会从直接Model中读取数据而不是通过 Controller。

在MVC里,View是可以直接访问Model的,从而,View里会包含Model信息,不可避免的还要包括一些业务逻辑。 在MVC模型里,Model不变时会有多个View。在MVC模型里,Model不依赖于View,但是View是依赖于Model的。不仅如此,因为有一些业务逻辑在View里实现了,导致要更改View也是比较困难的,至少那些业务逻辑是无法重用的。

在MVP里,Presenter完全把Model和View进行了分离,主要的程序逻辑在Presenter里实现。而且,Presenter与具体的View是没有直接关联的,而是通过定义好的接口进行交互,从而使得在变更View时候可以保持Presenter的不变.


参考资料:
https://blog.csdn.net/qq_25827845/article/details/53292312
http://www.runoob.com/design-pattern/mvc-pattern.html
https://blog.csdn.net/u011225629/article/details/47857979
https://baike.baidu.com/item/MVP/3714550

Python单元测试&文档测试

测试系列文章:
https://www.jianshu.com/nb/30319209

单元测试

需要引入unittest模块,并使用unittest.TestCase作为基类进行继承。

比如:已有自己的Dict类,import之后可以用以下方式验证:

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
26
27
28
29
30
31
32
import unittest

from mydict import Dict

class TestDict(unittest.TestCase):

def test_init(self):
d = Dict(a=1, b='test')
self.assertEquals(d.a, 1)
self.assertEquals(d.b, 'test')
self.assertTrue(isinstance(d, dict))

def test_key(self):
d = Dict()
d['key'] = 'value'
self.assertEquals(d.key, 'value')

def test_attr(self):
d = Dict()
d.key = 'value'
self.assertTrue('key' in d)
self.assertEquals(d['key'], 'value')

def test_keyerror(self):
d = Dict()
with self.assertRaises(KeyError):
value = d['empty']

def test_attrerror(self):
d = Dict()
with self.assertRaises(AttributeError):
value = d.empty

之后可以用python -m unittest mydict_test来测试mydict_test文件中的所有测试内容。

在类中还可以使用setUptearDown两个类函数来指定在测试前后要执行的操作。每一个测试方法前后都会分别执行这两个函数。

文档测试

在编写注释的时候,写上类似这样的注释:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
def abs(n):
'''
Function to get absolute value of number.

Example:

>>> abs(1)
1
>>> abs(-1)
1
>>> abs(0)
0
'''
return n if n >= 0 else (-n)

在模块被导入的时候,不会有影响;但是如果直接用python 执行该文件,就会自动进行测试,如果有错误就会显示出来,没有错误不会显示。


参考资料:
https://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/00140137128705556022982cfd844b38d050add8565dcb9000
https://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/00140137398003434356a2635da4a98b4d00670e8aadb2f000

React-Native开发-2018-03

React Native

一个使用React的方法编写App应用的工具,由FaceBook开发并且用于Instagram中,随后开源。由于仍在开发过程中,网上找到的很多示例代码以及教程都是基于旧的版本编写的,并不适用。

Nodejs安装与选择

Nodejs需要安装6.x.x或者7.x.x的版本(过低不支持,过高的话自带的npm版本不支持)

https://nodejs.org/en/ 里面直接下载安装即可,没有什么可说的。

Android开发

需要Android Studio,同时需要提前安装配置好Java环境

开始

直接按照官网(https://facebook.github.io/react-native/docs/getting-started.html)上的步骤配置即可。需要让电脑和手机在同一局域网内(直接连接同一个Wifi即可),同时注意使用VPN或者ss的话请绕过对应IP地址。

如果安装了adb工具并且连接了手机,会在android手机上自动安装上Expo,之后可以通过Expo进行应用的调试。但是默认选择的链接方式不一定是你所在的局域网(比如:如果有VMware的服务会使用VMWare的虚拟网络,所以需要停用这些网络)。

打开自己编写的React Native应用后,摇晃手机可以弹出菜单(注意要允许悬浮窗权限)

控件使用,React事件相应等

直接看React和React Native的官方教程即可。

UI设计以及第三方控件

为了使得开发更高效,可以选用第三方库:

https://www.jianshu.com/p/53ff78168acc

https://github.com/rilyu/teaset/blob/master/docs/cn/NavigationBar.md

Step by step

打开cmd(管理员模式)。需要先安装好nodejs、Android Studio,下载android sdk。

  1. cd命令到自己想要创建项目的目录下;

  2. 输入create-react-native-app mytest回车(这里的mytest是项目名称)

  3. 输入cd mytest进入刚才创建的项目目录中

  4. (可选,采用第三方库https://github.com/rilyu/teaset/)输入`npm install –save teaset`

  5. 运行:将安卓手机连接电脑,确保手机电脑在同一局域网内并且该局域网是输入ipconfig之后显示的第一个网络连接(不是的话直接设置网络,将其他不用的网络禁用就好),输入npm run android就可以了。也可以不连接电脑,下载完Expo后在里面的搜索框中输入控制台显示的exp:\地址即可(扫描二维码的方式对我的手机无效)。

  6. 如果可以运行显示出来三行文字,就说明环境配置工具安装什么的都没有问题。打开App.js文件,

React-Native踩坑

Nodejs版本选择:

因为现在需要的Node版本需要>=6,而且npm版本不能超过4(5.x.x有兼容性问题不能用),所以可以下载安装7.x.x的node(8+的node自带的npm版本为5)

局域网搭建:

按照官方教程开始搭建后,如果安装了adb工具会在android手机上自动安装上Expo,之后可以通过Expo进行应用的调试。但是默认选择的链接方式不一定是你所在的局域网(比如:如果有VMware的服务会使用VMWare的虚拟网络,所以需要停用这些网络)

切记如果使用VPN或者ss要绕过局域网网段!

第三方UI设计组件等内容:

https://www.jianshu.com/p/53ff78168acc

https://github.com/rilyu/teaset/blob/master/docs/cn/NavigationBar.md

使用教程http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2016/1112/6766.html时:

react-native run-android命令需要:cmd中设置代理set HTTP_PROXY=http://127.0.0.1:1080/

设置环境变量ANDROID_HOME,path之中添加%JAVA_HOME%\bin

Wecode-docker相关测试环境安装

docker
https://blog.csdn.net/rickey17/article/details/72809384
mysql
https://jingyan.baidu.com/article/fec7a1e5f8d3201190b4e782.html
docker中访问外部网络:
sudo docker pull ubuntu
sudo docker run -it -p 3206:3206 –name fh ubuntu
可以与外部进行链接
安装mysql
apt install mysql-client
把一个以f7开头的container保存成wecode,标签为v1:
sudo docker commit f7 wecode:v1
可以共享文件夹:
docker run -v /home/wecode/test_share:/dockerfolder -it –name fh3 wecode:v1

docker链接外部服务器mysql

sudo apt install docker.io
docker pull ubuntu
docker run -it –name fh ubuntu
docker ps -a
docker commit ad wecode:v1
docker run –rm -it –network=host wecode:v1 mysql -h 127.0.0.1 -uroot -p

docker删除镜像

images查看镜像
先ps -a看所有用到这个镜像的,之后rm id删掉
rmi imagename

node

sudo docker pull node

django-test

测试系列文章:
https://www.jianshu.com/nb/30319209

django test

django的测试是使用python的单元测试unittest(可以看https://www.jianshu.com/p/1f4bf3e92f5a)。

使用:

  • python manage.py test可以直接测试所有以test开头的文件中查找所有的test cases(inittest.TestCase的子类),自动建立测试集然后运行测试。
  • python manage.py testanimals.tests:执行animals项目下tests包(testanimals)里的测试。
  • python manage.py testanimals:执行animals项目里的test测试。
  • python manage.py testanimals.tests.AnimalTestCase:单独执行某个test case
  • python manage.py testanimals.tests.AnimalTestCase.test_animals_can_speak:单独执行某个测试方法
  • python manage.py testanimals/:为测试文件提供路径
  • python manage.py test--pattern="tests_*.py":通配测试文件名
  • python -Wall manage.py test:启用warnings提醒