犯了一个严重的错误,居然忘了switch-case,在执行完一个case之后是继续向下走的!因此注意是否要在每个case中加‘break’
问题描述
罗马数字转阿拉伯数字。注意类似“4”和“9”的情况。
问题分析
想到了最简单地解决方法:从前向后遍历,遇到字母就加上对应的数字,只不过要注意‘I’等字母,看是否出现类似“4”和“9”的情况。更高效的方法暂时还没想到。
代码
1 | int romanToInt(string s) { |
犯了一个严重的错误,居然忘了switch-case,在执行完一个case之后是继续向下走的!因此注意是否要在每个case中加‘break’
罗马数字转阿拉伯数字。注意类似“4”和“9”的情况。
想到了最简单地解决方法:从前向后遍历,遇到字母就加上对应的数字,只不过要注意‘I’等字母,看是否出现类似“4”和“9”的情况。更高效的方法暂时还没想到。
1 | int romanToInt(string s) { |
阿拉伯数字转罗马数字,符号与对应数值如下:
1 | Symbol Value |
需要注意的是减法的情况(4和9)
有限的几个字母,比较好处理,先将数字减至1000以下,这个过程中只用考虑M的个数;然后就可以按照位数,循环地处理剩下的数字了。对于剩下的数字,位数上数字为4和9的需要单独处理,剩下的就是字符串循环加,数字循环减。用k来表示此时处理到的基数,k=100,10,1.最后退出循环,返回字符串。
1 | string intToRoman(int num) |
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 | int maxArea(vector<int>& height) { |
给定一个字符串 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。
状态转移方程:
dp[i][j] = dp[i - 1][j - 1]
, if p[j - 1] != '*' && (s[i - 1] == p[j - 1] || p[j - 1] == '.')
;dp[i][j] = dp[i][j - 2]
, if p[j - 1] == '*'
and the pattern repeats for 0 time;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 | bool isMatch(string s,string p) |
报错: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:背景层+铅笔层+陆地层+小鸟
关于铅笔:定期随机创建两组
wx.createCanvas()在适配器文件js/libs/weapp-adapter.js中已经调用了一次,返回的canvas是全局变量,不能在适配器文件后面再调用该函数,否则会离屏。
语句、语句块:在 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 | int main () |
https://www.runoob.com/cplusplus/cpp-variable-scope.html完成其中的两个练习
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上看看别人的小项目。
备注:每小节中需要理解的概念用红色标出
https://baijiahao.baidu.com/s?id=1615197669504904831&wfr=spider&for=pc
标准的 C++ 由三个重要部分组成:
建议使用vs2017,在官网下载 社区版
安装教程——完成步骤一至四,并熟悉主页面的菜单栏
以hello world代码为例初识 程序结构(头文件、命名空间、主函数)
1 | #include <iostream> |
安装教程——参照步骤五,新建项目,在源文件中新建C++文件,输入代码,点击运行(界面上方绿色小箭头,或键盘F5)。在进行C/C++编程的时候,在运行程序查看输出效果时,会出现窗口闪一下就关闭的情况。
注:在C++中一般在main函数中的return之前添加system(“pause”);这样就可以看清楚输出的结果,pause会输出”press any key to continue. . .”。
使用hexo时遇到的两个小问题:
原因:创建的md文件头部声明中没有加空格
原因:当文章中两个连续的大括号时,且这两个括号未被代码块包含,解析会出问题
SVN(Subversion)是集中式管理的版本控制器,而Git是分布式管理的版本控制器!这是两者之间最核心的区别。
SVN只有一个单一的集中管理的服务器,保存所有文件的修订版本,而协同工作的人们都通过客户端连到这台服务器,取出最新的文件或者提交更新。
Git每一个终端都是一个仓库,客户端并不只提取最新版本的文件快照,而是把原始的代码仓库完整地镜像下来。每一次的提取操作,实际上都是一次对代码仓库的完整备份。
发表的文章在本地预览无误后,在 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 | data: { |
bindtap:按键的事件处理函数
报错:app is not defined;
解决:js文件Page同级,Page前面增加:
1 | const app = getApp() |
我的页面的样式选择的是带说明、跳转的列项表,用到了 navigator 组件。
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 | "permission": { |
要在 app.json 文件中加上对应的所有页面路径
url链接里面不能存在空格
如果因为this.setData()使用次数过多而报错,可以使用:
1 | var that = this; |
data数组中部分大小写,触发函数的返回值中都是小写,所以在使用返回值进行赋值时使用小写。
wx.chooseLocation()
wx.getLocation()
buttonde disabled属性
JS实现经纬测距
let 只能在一块(即一个{}中的区域叫做一个块域)中使用定义过的变量,可以是用 var 来定义变量,因为 var 是全局变量,跳出 for 循环以后还是可以使用,还有 const 用来定义常量,使用时必须初始化(即必须赋值),只能在块作用域里访问,跳出块也不能访问变量,而且不能修改。
成功回调函数里面默认this是指成功回调函数里的this而不是与函数同级的data数组,解决方案:在回调函数外面定义var that = this,在回调函数中可以使用that,或者,改变回调函数的定义,使用success: (res) => {…}
保留到小数点后三位:
1 | var s = ... |
采用 wampserver 即 Windows、Apache、 MySQL 和 PHP 的集成环境,搭建本地环境
tableBar跳转失效:
1 | wx.redirectTo({ |
解决方法:使用:
1 | wx.switchTab({ |
后台向前台返回值使用ajaxReturn
后台使用I()方法获取前台传来的值
后台通过M()方法实例化数据库(M()使用驼峰命名法,因此数据库表名中的下划线需要修改)
1 | $model = M("Column"); |
带餐返回的值储存在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开发、下载及更新问题,借助微信的推广
项目文件结构:
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 | "tabBar":{ |
调试可使用console.log(<要打印的内容>)
C语言测试小程序,增加做题情况
要使 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中使用\
openAlert 函数