A
Leetcode算法题(easy):
我的代码如下:
class Solution {
public:
int strStr(string haystack, string needle) {
int len_hay, len_nee;
len_hay = haystack.length();
len_nee = needle.length();
if (needle == "") {
return 0;
}
for(int j = 0; j < len_hay; j++)
{
if(haystack[j] == needle[0]) {
int temp = j, flag = 1;
for(int n = 1; n < len_nee; n++)
{
if(haystack[j + n] != needle[n]) {
flag = 0;
break;
}
}
if (flag == 1) {
return temp;
}
}
}
return -1;
}
};
本周的算法题并不难,重要的部分在于对程序的优化。
主要问题:
仍然是溢出的问题,在比较外层数组与内层数组元素的值时,未注意到溢出的可能性,溢出问题划重点。
第一次尝试,使用了三层的循环嵌套,导致运行超时,后来发现可简化为二层循环嵌套,大大减少了运行时间;但是提交之后,很明显地发现,运行时间仍然太长,于是欣赏了一下4ms的样本:
class Solution {
public:
int strStr(string haystack, string needle) {
if (needle.empty()) return 0;
int m = haystack.size(), n = needle.size();
for (int i = 0; i <= m - n; i++) {
int j;
for ( j = 0; j < n; j++) {
if (haystack[i+j] != needle[j]) break;
}
if (j == n) return i;
}
return -1;
}
};
同样的二层循环,但是判断条件很精妙。我引入了temp
和flag
操作,但是他在外层提前限制了i
的范围,直接对字符串进行比较,明显更简洁有效。
R
- 数据建模:记录软件和业务系统的一种设计;
- 特征:常图标、符号、文本引用,使用一些软件、数据架构表现数据流动的方式。
- 数据模型:记录、定义、组织、展示给定数据库、体系结构、应用程序以及平台的数据结构如何在给定的系统以及其它系统之间进行联系、存储、访问、接受和处理的。
- 三大数据模型:
- 物理数据模型:实际的数据库结构,包括表与列,或计算机处理过程时互相发送的信息。
- 逻辑数据模型:完全归一化的完全归因数据模型, 包括:1. 可存储数据的限制;2. 与逻辑数据模型所服务的应用程序处理有关的规则和派生数据。
- 概念数据模型:业务中的事物以及他们之间的关系,而非数据关于那些事物的模型。
- 数据建模与组织的优势:更高的软件开发质量;减少开支;更快投入市场;对范围、词汇以及其他事物的清晰理解;更好的应用和数据库性能;更高的记录质量;更少的软件错误;更少的组织系统中的数据错误;更好的风险管理。
(其概念与自身理解有些不同,但很显然,数据模型的建立能让一切都变得更加井然有序)
T
最近参加了学校的数模比赛,所以学习了一些与数学建模有关的内容,主要是 Dijkstra 最短路算法。
- 算法的主要思想内容(我的理解):这是一个单源的(即只有一个源头的)最短路线问题,将路线图矩阵化,利用矩阵的特性存储路线的起点(
i
)、终点(j
)、路径长度(第i
行第j
列的值),然后在矩阵内求解。 - 算法核心部分:
- 原矩阵
P
中第i
行第j
列的值,即i-->j
的长度。 - 令
dis[]=P[1](矩阵第一行)
,则dis[i]
为起点到第i
个元素的长度。 - 判断
dis[j]
与dis[i]+P[i][j]
的大小;若dis[j]>dis[i]+P[i][j]
,则将dis[j]=dis[i]+P[i][j]
(即将dis[j]
松弛,本句含义为:当(由起点直接指向第j
个元素的长度>
由起点dis[1]
指向第i
个元素的长度+
第i
个元素指向第j
个元素的长度)成立,则“松弛”由起点指向第j
个元素的长度;松弛后的值=
由起点dis[1]
指向第i
个元素的长度+
第i
个元素指向第j个元素的长度```)。
S
试着参加了数学的建模比赛,越来越发现算法的重要性,一个简单的算法能十分轻松地解决问题;而生活中的各种各样的与生活实际相联系的数学模型的建立也离不开算法。在学习算法的过程中,我也发现了伪代码的优越性——能让我更容易地理解并掌握算法,伪代码真是一个好东西。