0%

犯了一个严重的错误,居然忘了switch-case,在执行完一个case之后是继续向下走的!因此注意是否要在每个case中加‘break’

问题描述

罗马数字转阿拉伯数字。注意类似“4”和“9”的情况。

问题分析

想到了最简单地解决方法:从前向后遍历,遇到字母就加上对应的数字,只不过要注意‘I’等字母,看是否出现类似“4”和“9”的情况。更高效的方法暂时还没想到。

代码

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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
int romanToInt(string s) {
int len = s.length();
int i = 0, res = 0;
while (i < len)
{
switch (s[i])
{
case 'M':
{
res += 1000;
break;
}
case 'D':
{
res += 500;
break;
}
case 'C':
{
if (i + 1 < len)
{
if (s[i + 1] == 'D')
{
res += 400;
++i;
}
else if (s[i + 1] == 'M')
{
res += 900;
++i;
}
else
res += 100;
}
else
res += 100;
break;
}
case 'L':
{
res += 50;
break;
}
case 'X':
{
if (i + 1 < len)
{
if (s[i + 1] == 'L')
{
res += 40;
++i;
}
else if (s[i + 1] == 'C')
{
res += 90;
++i;
}
else
res += 10;
}
else
res += 10;
break;
}
case 'V':
{
res += 5;
break;
}
case 'I':
{
if (i + 1 < len)
{
if (s[i + 1] == 'V')
{
res += 4;
++i;
}
else if (s[i + 1] == 'X')
{
res += 9;
++i;
}
else
res += 1;
}
else
res += 1;
}
}
++i;
}
return res;
}

半个小时写完了代码,提交之后一遍过,这种感觉还是比较爽的。

题目描述

阿拉伯数字转罗马数字,符号与对应数值如下:

1
2
3
4
5
6
7
8
Symbol       Value
I 1
V 5
X 10
L 50
C 100
D 500
M 1000

需要注意的是减法的情况(4和9)

解决思路

有限的几个字母,比较好处理,先将数字减至1000以下,这个过程中只用考虑M的个数;然后就可以按照位数,循环地处理剩下的数字了。对于剩下的数字,位数上数字为4和9的需要单独处理,剩下的就是字符串循环加,数字循环减。用k来表示此时处理到的基数,k=100,10,1.最后退出循环,返回字符串。

代码

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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
string intToRoman(int num) 
{
string res = "";
int remain = num;
while ((remain / 1000) > 0)
{
res += "M";
remain -= 1000;
}
int k = 100;
while (k > 0)
{
if ((remain / k) > 4)
{
if ((remain / k) == 9)
{
remain -= 9 * k;
if (k == 100)
res += "CM";
else if (k == 10)
res += "XC";
else
res += "IX";
}
else
{
remain -= 5 * k;
if (k == 100)
res += "D";
else if (k == 10)
res += "L";
else
res += "V";
}
}
if ((remain / k) == 4)
{
remain -= 4*k;
if (k == 100)
res += "CD";
else if (k == 10)
res += "XL";
else
res += "IV";
}
if ((remain / k) < 4)
{
while ((remain / k) > 0)
{
remain -= k;
if (k == 100)
res += "C";
else if (k == 10)
res += "X";
else
res += "I";
}
}
k /= 10;
}
return res;
}

题目描述

Given n non-negative integers a1, a2, …, an , where each represents a point at coordinate (i, ai). n vertical lines are drawn such that the two endpoints of line i is at (i, ai) and (i, 0). Find two lines, which together with x-axis forms a container, such that the container contains the most water.

Note: You may not slant the container and n is at least 2.

相当于要找数组中的某两个数,使得这两个数的间距与两数中的较小数的乘积取最大值。比较直接的方法是遍历,时间复杂度为O(n^2)。若要智取,可以考虑不断缩减两个数的间距,通过减小长度,增加高度的方法增大面积。两个数中,哪个数更大,就向那一边移动。

两个数相等怎么办呢?两边方向都可以。因为最终高度取决于较小的数,而两个等高的柱子之间,要么比他们更高,但距离更小;要么高度和距离都更小。唯一可能增大面积的情况是等高柱子中间的两个最大的数组合,但无论从哪一边移动,都会遇到这个情况,不会被遗漏。这样的方法每个数只遍历一遍,时间复杂度为O(n)。

解决方案

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
int maxArea(vector<int>& height) {
int len = height.size()-1;
int left = 0;
int right = len;
int max = 0;
int low = height[0];
while (len > 0)
{
if (height[left] < height[right])
{
low = height[left];
max = max > low*len ? max : low * len;
++left;
}
else
{
low = height[right];
max = max > low*len ? max : low * len;
--right;
}
--len;
}
return max;
}

题目描述

给定一个字符串 s 和一个字符规律 p,实现一个支持 ‘.’ 和 ‘*’ 的正则表达式匹配。

‘.’ 匹配任意单个字符
‘*’ 匹配零个或多个前面的那一个元素

说明:

s 可能为空,且只包含从 a-z 的小写字母。
p 可能为空,且只包含从 a-z 的小写字母,以及字符 . 和 *。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/regular-expression-matching

解题思路

使用==动态规划==的方法。如果s[0..i) 成功匹配 p[0..j) ,令dp[i][j]为true,否则为false。”.”的情况较易处理,主要需要考虑”*“的影响,它可能表示多个连续相同的字母,也可能使它的前一个字母“消失”。一、p[j - 1] != ‘*‘,这是最简单的情况,只需要直接比较当前的两个字母,并向前移动 i 和 j ;二、p[j - 1] == ‘*‘,根据前面分析的’*‘的两种作用,这里需要细分为两种情况。在所有的情况下,i 和 j 都在单个或一起向前移,所以需要一个二重循环,在最内层用 if - else 对dp进行赋值。注意dp[0][0] = 1,表示s和p都为空串;dp[0][j]=0,表示s串前推到头时,如果p串还未结束,则返回false。

状态转移方程:

  1. dp[i][j] = dp[i - 1][j - 1], if p[j - 1] != '*' && (s[i - 1] == p[j - 1] || p[j - 1] == '.');
  2. dp[i][j] = dp[i][j - 2], if p[j - 1] == '*' and the pattern repeats for 0 time;
  3. dp[i][j] = dp[i - 1][j] && (s[i - 1] == p[j - 2] || p[j - 2] == '.'), if p[j - 1] == '*' and the pattern repeats for at least 1 time.

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
bool isMatch(string s,string p)
{
int m = s.length(), n = p.length();
bool **dp = new bool*[m+1];
for (int i = 0; i < m + 1; ++i)
dp[i] = new bool[n + 1];
for (int i = 0; i <= m; ++i)
for (int j = 0; j <= n; ++j)
dp[i][j] = 0;
dp[0][0] = 1;
for (int i = 0; i <= m; ++i)
{
for (int j = 1; j <= n; ++j)
{
if (p[j - 1] == '*')
dp[i][j] = dp[i][j - 2] || (i>0&&dp[i - 1][j] && (s[i - 1] == p[j - 2] || p[j - 2] == '.'));
else
dp[i][j] = i>0 && dp[i - 1][j - 1] && (s[i - 1] == p[j - 1] || p[j - 1] == '.');
}
}
return dp[m][n];
}

报错解决

报错:string subscript out of range

解决:可能的原因是数组索引超出范围。在此次代码中出现这个问题的原因是我把 j 写成 i 了,导致访问数组是下标超限。

小游戏开发

开发与调试环境:IDE: 在webStorm里开发,node和babel(es5和es6做转换)等前端工具链。

游戏开发——面向对象

canvas——剪裁和重绘的过程

“精灵”指游戏中一切呈现的元素

es5: use strict

模块分解

game.js程序入口;main.js程序主类,初始化canvas和全局对象;director.js控制游戏逻辑;DataStore.js储存长期保存的变量;ResourceLoader.js资源加载器;Sprite.js游戏精灵的基类……

图片原理:cavas:背景层+铅笔层+陆地层+小鸟

关于铅笔:定期随机创建两组

API

wx.createCanvas()在适配器文件js/libs/weapp-adapter.js中已经调用了一次,返回的canvas是全局变量,不能在适配器文件后面再调用该函数,否则会离屏。

基本语法2

语句、语句块:在 C++ 中,分号是语句结束符,每个语句必须以分号结束。语句块是一组使用大括号括起来的按逻辑连接的语句。

标识符(类比于人的名字):C++ 标识符是用来标识变量、函数、类、模块,或任何其他用户自定义项目的名称。一个标识符以字母 A-Z 或 a-z 或下划线 _ 开始,后跟零个或多个字母、下划线和数字(0-9)。C++ 标识符内不允许出现标点字符,比如 @、& 和 %。C++ 是区分大小写的编程语言。

关键字

注释简介

注释用于解释代码段,编译器会忽略注释。

单行注释以双斜线(//)开始,以换行符结束;多行注释可以使用界定符对(/*和*/)

二进制

整数:二进制、八进制、十六进制之间的互转;二进制与十进制互转;

https://blog.csdn.net/huang1600301017/article/details/85332693

小数:二进制与十进制互转

https://blog.csdn.net/qq_42552533/article/details/85010810

原码、反码、补码

https://blog.csdn.net/w893932747/article/details/80803271

变量和基本类型

算术类型(字符、整形术、布尔值、浮点数)、空类型。参见《Primer C++》30页或:

https://www.runoob.com/cplusplus/cpp-variable-types.html

区别:bit(比特)、byte(字节)、word(字) 参见:https://blog.csdn.net/qq_36205380/article/details/81353489

掌握常见数据类型(int, short ,long, float, char, double…)的含义、位数以及相互之间的区别。

如何声明变量?左值和右值?根据位数计算常见基本类型的取值范围?

以下代码的输出结果?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
int main ()
{
// 变量定义
int a, b;
int c;
float f;

// 实际初始化
a = 10;
b = 20;
c = a + b;

cout << c << endl ;

f = 70.0/3.0;
cout << f << endl ;

return 0;
}

作用域

https://www.runoob.com/cplusplus/cpp-variable-scope.html完成其中的两个练习

ASCII码

https://www.cnblogs.com/seer/p/3578382.html?utm_source=tuicool&utm_medium=referral

要熟悉a-z,A-Z,0-9的ASCII码

常量、运算符、分隔符

c2.pptx 21–28页(浮点数的存储可以不看)

https://www.runoob.com/cplusplus/cpp-constants-literals.html

https://www.runoob.com/cplusplus/cpp-operators.html

最后可以看一下c3&c4.pptx 14-19页

写在前面

教材推荐:C++Primer

网课推荐:程序设计入门

学习过程中可能遇到各种各样的问题,学习编程一定要学会借助大家的力量,学会在网上找答案,你遇到的问题大部分都是别人遇到过并且已经解决的,建议多百度,多谷歌。

CSDN上有许多技术文章和资源;

网课,推荐 MOOC,网易云课堂,慕课网等网站;

系统性的资料,可以查 菜鸟教程等网站;

拓展的话,可以在github上看看别人的小项目。

备注:每小节中需要理解的概念用红色标出

C++简介

高级语言、编译语言

https://baijiahao.baidu.com/s?id=1615197669504904831&wfr=spider&for=pc

组成部分

标准的 C++ 由三个重要部分组成:

  • 核心语言,提供了所有构件块,包括变量、数据类型和常量,等等。
  • C++ 标准库,提供了大量的函数,用于操作文件、字符串等。
  • 标准模板库(STL),提供了大量的方法,用于操作数据结构等。

编译工具

建议使用vs2017,在官网下载 社区版

安装教程——完成步骤一至四,并熟悉主页面的菜单栏

基本语法1

程序结构

以hello world代码为例初识 程序结构(头文件、命名空间、主函数)

1
2
3
4
5
6
7
8
9
10
#include <iostream>
using namespace std;

// main() 是程序开始执行的地方

int main()
{
cout << "Hello World"; // 输出 Hello World
return 0;
}
  • C++ 语言定义了一些头文件,这些头文件包含了程序中必需的或有用的信息。上面这段程序中,包含了头文件
  • 下一行 using namespace std; 告诉编译器使用 std 命名空间。命名空间是 C++ 中一个相对新的概念。
  • 下一行 // main() 是程序开始执行的地方 是一个单行注释。单行注释以 // 开头,在行末结束。
  • 下一行 int main() 是主函数,程序从这里开始执行。
  • 下一行 cout << “Hello World”; 会在屏幕上显示消息 “Hello World”。
  • 下一行 return 0; 终止 main( )函数,并向调用进程返回值 0。

编译执行helllo world

安装教程——参照步骤五,新建项目,在源文件中新建C++文件,输入代码,点击运行(界面上方绿色小箭头,或键盘F5)。在进行C/C++编程的时候,在运行程序查看输出效果时,会出现窗口闪一下就关闭的情况。

注:在C++中一般在main函数中的return之前添加system(“pause”);这样就可以看清楚输出的结果,pause会输出”press any key to continue. . .”。

使用hexo时遇到的两个小问题:

YAMLException

原因:创建的md文件头部声明中没有加空格

Template render error

原因:当文章中两个连续的大括号时,且这两个括号未被代码块包含,解析会出问题

版本管理SVN与GIT

SVN(Subversion)是集中式管理的版本控制器,而Git是分布式管理的版本控制器!这是两者之间最核心的区别。
SVN只有一个单一的集中管理的服务器,保存所有文件的修订版本,而协同工作的人们都通过客户端连到这台服务器,取出最新的文件或者提交更新。
Git每一个终端都是一个仓库,客户端并不只提取最新版本的文件快照,而是把原始的代码仓库完整地镜像下来。每一次的提取操作,实际上都是一次对代码仓库的完整备份。

ssh: Could not resolve hostname github.com: Name or service not known; fatal: The remote end hung up unexpectedly

发布博客到Github:

发表的文章在本地预览无误后,在 Git Bash 命令窗口执行以下命令:

1
hexo clean && hexo g && hexo d

“我的页面”

./ 表示同级目录

媒体组件 image 属性

image 链接语句:

1
src="{{userInfo.head_img1?userInfo.head_img:'/image s/default_head_circle.png'}}"

如果 storage当中获取到 userInfo.head_img,则打印出 userInfo.head_img,反之 则打印 image 文件中的 default_head_circle.png 图片

WXSS属性

rpx(responsivepixel): 可以根据屏幕宽度进行自适应。


userinfo 的值是通过向后台访问请求,获取到的用户信息,并存在本地, 然后从本地读取出来进行赋值。请求的代码写在 app.js 中。myinfo.js 文件的 data 数组中定义 userinfo,并在 onLoad 函数中对 userinfo变量进行赋值。

bindchange检测输入框中的文字变化,bingchange=”changeName”,”changeName”函数写在js中,与data同级

1
2
3
4
5
6
7
8
9
data: {
name:''
},

changeName:function(e){
this.setData({
name: e.detail.value
})
},

bindtap:按键的事件处理函数

报错:app is not defined;

解决:js文件Page同级,Page前面增加:

1
const app = getApp()

我的页面的样式选择的是带说明、跳转的列项表,用到了 navigator 组件。

change页面

valuechange 函数

submit 函数

onLoad函数只有在重新编译或者关闭该页面重新打开时才会执行,onShow 函数的作用是
监听页面显示,会在页面每次显示时执行。

wx.showToast()弹窗

配置文件:所有的 wx.request()请求,url 的网址都有很多共同之处,所以把共同之
处作为一个宏进行定义,后面维护起来方便修改与迁移。增加config.js(与app.js同级)

userUrl: `${apiUrl}/User/`

model.export = config 接口暴露

例如在app.js中使用配置文件的数据时:

1
const wxUrl = require('./config.js').wxUrl

model.export = config 接口暴露

报错:Setting data field “value” to undefined is invalid.

解决:可能是与后台命名不一致的问题

课程模块

访问链接向后台申请课程号,响应结果:课程号创建成功,课程号:10853

报错:getLocation需要在app.json中声明permission字段

解决:在app.json中增加以下代码

1
2
3
4
5
"permission": {
"scope.userLocation": {
"desc": "你的位置信息将用于小程序位置接口的效果展示"
}
},

做题模块

要在 app.json 文件中加上对应的所有页面路径

url链接里面不能存在空格

如果因为this.setData()使用次数过多而报错,可以使用:

1
2
var that = this;
that.setData(that.data);

data数组中部分大小写,触发函数的返回值中都是小写,所以在使用返回值进行赋值时使用小写。

签到测距模块

wx.chooseLocation()

wx.getLocation()

buttonde disabled属性

JS实现经纬测距

let 只能在一块(即一个{}中的区域叫做一个块域)中使用定义过的变量,可以是用 var 来定义变量,因为 var 是全局变量,跳出 for 循环以后还是可以使用,还有 const 用来定义常量,使用时必须初始化(即必须赋值),只能在块作用域里访问,跳出块也不能访问变量,而且不能修改。

成功回调函数里面默认this是指成功回调函数里的this而不是与函数同级的data数组,解决方案:在回调函数外面定义var that = this,在回调函数中可以使用that,或者,改变回调函数的定义,使用success: (res) => {…}

保留到小数点后三位:

1
2
var s = ...
s = s.toFixed(3)

后台与数据库

采用 wampserver 即 Windows、Apache、 MySQL 和 PHP 的集成环境,搭建本地环境

tableBar跳转失效:

1
2
3
wx.redirectTo({
url: '../index/index',
})

解决方法:使用:

1
2
3
wx.switchTab({
url: '../index/index',
})

后台向前台返回值使用ajaxReturn

后台使用I()方法获取前台传来的值

后台通过M()方法实例化数据库(M()使用驼峰命名法,因此数据库表名中的下划线需要修改)

1
2
3
4
5
6
7
$model = M("Column");
//创建一个Column模型,对应数据库中的Column表,如果有前缀就是 前缀_Column表

$columninfo = $model -> field("pid,image")->where("id=".$pid) -> find() ;
//设定查询字段为 pid 和 image,条件是 id=$pid
//find()方法是找出一条数据
//$columninfof是一个数组返回值,起结构为 array('pid'=>"***",'image'=>"***")

API开发与云平台使用

带餐返回的值储存在option里面

课程号创建成功,课程号:10016

云开发(使用JSON数据库)

关系型数据库和JSON数据库:

关系型 文档型
数据库database 数据库database
表table 集合collection
行row 记录record/doc
列column 字段field

MOOC教程:https://www.icourse163.org/learn/HZIC-1205901813?tid=1206204209#/learn/content

微信小程序诞生背景:网页速度慢,APP开发、下载及更新问题,借助微信的推广

  1. 注册微信小程序

  2. 安装开发者工具

  3. 创建小程序

项目文件结构:

pages:小程序的页面,每个页面有js(定义函数),wxml,wxss(页面样式),json(配置文件)文件

app:全局页面,app.json中pages第一行是进入小程序的首页,windows状态栏、导航栏等设置

在index.js的data里面定义参数(可定义初始值或之后赋值),bindViewTag定义事件处理函数,在index.wxml里使用,变量要使用双括号。

右下方窗口APPData中可查看登录者微信设置

tabBar

在app.json文件中与window同级,若要为按钮增加图标,需要将图片保存在与pages同级的文件夹(images)中,iconPath指的是没有被选中时的按钮图标,selectedIconPath表示被选中时的图标。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
"tabBar":{
"list":[
{
"pagePath":"pages/index/index",
"text":"首页",
"iconPath":"images/first1.png",
"selectedIconPath":"images/first2.png"
},
{
"pagePath": "pages/logs/logs",
"text": "日志",
"iconPath": "images/log1.png",
"selectedIconPath": "images/log2.png"
}
]
},

调试可使用console.log(<要打印的内容>)

C语言测试小程序,增加做题情况

我的页面模块开发

3

要使 wx.login 方法的 wx.request()中的 url 实现访问后台,需要前往https://zjgsujiaoxue.applinzi.com/index.php/Page/Index/register进行进行使用注册。 调用该接口需要 2 个参数,即开发者的 appid 与 appsecret。

微信官方 UI 库 WeUI

将 style 文件夹拷贝至自己开发的项目后,在 app.wxss 文件中使用 @import 导入 weui 的样式

bindchange 事件

当输入框中的内容发生改变时, 触发对应的事件处理函数,并且输入框中的值可以通过 event.detail.value 来获取

在wxml中使用\的 class 类最后新加一个 submit 子类,在 wxss 文件中写 submit 子类样式的相关属性

openAlert 函数