序言
一个实验就要求自学Java,MYSQL,HTML。。。太残酷了吧,视频学习后抽空做做题更博客,并不喜欢markdown,今天试试富文本。考虑要现学现用,争取在题目中多落实学习的东西。今天就是试着从《Effective C++》学得的第一点,也是最简单的一点:多用const声明不需要变动的常量吧。然后从今天开始用C++和JAVA共同实现吧,多多熟悉两者的异同,以后还可以考虑PYTHON的加入~
题目
这个图片比例。。
有点类似做过的最大子段和,不过貌似没那么复杂。这个貌似只用建立一个数组,记录从当前字母尽量往后找到一个跟自己一样的字母,这之间的字符个数即可。然后选取一个数组中最大的值即为答案。
第一次实现(C++)
class Solution {
public:
int lengthOfLongestSubstring(string s) {
int result=1;
const int n=s.length();//记录从该字母开始最大符合要求的字符个数
int count[n]={0};//对于局部变量,如果一个数组被部分初始化,没有被初始化的元素会被自动设置为相应类型的0
memset(count,0,n);
for(int i=0;i<n-1;i++){
for(int j=i+1;j<n;j++){
if(s[i]!=s[j])
count[i]++;
else
break;
}
if(count[i]>result)
result=count[i];
}
return result+1; //包含自身故+1
}
};
发现错误在于
int count[n]={0}
Dev 报错为: [Error] variable-sized object 'count' may not be initialized
意思是数组大小不确定,不能在定义count的时候就赋值,无论是赋值单个还是赋值全部。因此换用memset();
即将初始置0的部分换为:
int count[n];
memset(count,0,n);
发现结果感人:
简直差太多了。。
经过一番研究发现:
在数组初始置0的时候出错,再试验一番后:
网上查的:
memset(arr, 0, 1024); //memset(结构体/数组名 , 值/用于替换的ASCII码对应字符 , 前n个字符 );
是错的。。。准确是第三个参数并不是字符数,而是字节数!!!因此int 应该改为用4*n;看来网上的资料不能盲目相信,还是要自己验证。
经过改正后
memset(count,0,n); ===》 memset(count,0,n*4);
数组初始置0无误,但是。。结果依旧错误。
发现是思路错误,重新来过。。
这次用最笨的办法,对于设置一个“集合”记录出现过的元素,以每个字母为首搜索一遍,找到最大值。
第二次实现(C++)
class Solution {
public:
int lengthOfLongestSubstring(string s) {
int result=1;
const int n=s.length();//记录从该字母开始最大符合要求的字符个数
int count[n];
memset(count,0,n*4);
for(int i=0;i<n-1;i++){
vector <char> v;//试着用新学的vector;
v.push_back(s[i]);
for(int j=i+1;j<n;j++){
int flag =0;
for(int k=0;k<v.size();k++){
if(v[k]==s[j]){
flag=1;
break;
}
}
if(flag==0){
v.push_back(s[j]);
count[i]++;
}
else
break;
}
if(count[i]>result)
result=count[i];
}
return result+1;
}
};
案例结果都对。。但是提交错误
- 没考虑数组为空
variable length array bound evaluates to non-positive value 0
网上查询的结果如上
加上这一条后,不管怎么改动后面的代码都各种报错,大意就是说n没有n可能没有,不能执行。。。崩溃。。。
时间有限只能暂时作罢,此问题遗留待日后解决吧。。如果有大佬碰巧看见这篇文章,恳请指导一二,多谢多谢
(2018.11.27 21:58留)
最后调试完善“妥协”版:
class Solution {
public:
int lengthOfLongestSubstring(string s) {
int result=0;
const int n=s.length();//记录从该字母开始最大符合要求的字符个数
if(n==0)
return 0;
int count[300000];
memset(count,0,1200000);
for(int i=0;i<n-1;i++){
vector <char> v;//试着用新学的vector;
v.push_back(s[i]);
for(int j=i+1;j<n;j++){
int flag =0;
for(int k=0;k<v.size();k++){
if(v[k]==s[j]){
flag=1;
break;
}
}
if(flag==0){
v.push_back(s[j]);
count[i]++;
}
else
break;
}
if(count[i]>result)
result=count[i];
}
return result+1;
}
};
通过
所学知识汇总
如何将数组初始化为全0?
(学习自http://www.cnblogs.com/programnote/p/4719078.html)
C语言中,声明数组的语句:
int arr[100];
这样声明得到的数组里面的存储的是随机的我们不知道的数据,对用户来说就是垃圾。有许多情况我们要将数组初始化为全零的情况才能进行其他操作。
最简单的方法就是用一个循环吧数组所有元素设置为0:
int arr[100]; int i = 0; for(i = 0 ; i < 100 ; i++) arr[i] = 0; //This will make all ZERO
我们还可以利用其他几种方式做到初始化数组为0:
1、全局变量和静态变量初始化时会自动被设置为0。如果们声明全局变量,那么他在运行前会变成全0。
int arr[1024]; // This is global int main(void) { //statements }
2、对于局部数组我们还有简写的初始化语法。如果一个数组被部分初始化,没有被初始化的元素会被自动设置为相应类型的0。这是编译器自动完成的。可以这样写:
int main(void) { int arr[1024] = {0}; // This will make all ZERO // statements }
3、你还可以用memset函数(头文件需要:在C++中 #include <cstring> )在程序开始时初始化数组。这条命令这在你已经修改了数组之后又想将它重置为全0特别有用。
int类型
int arr[1024]; arr[5] = 67; memset(arr, 0, 1024); //memset(结构体/数组名 , **, 前n个字节数 );是字节数!!!int 4个,char 1个!!!
**的位置本来网上查询时是: 值/用于替换的ASCII码对应字符
但是事实上memset (arr,1,4*n)的时候显示被初始化为:16843009,结合第三个参数是关于字节的,大胆猜测第二个是否也是直接对位(bit)操作于是有
int n=4;
int count[n];
memset(count,1,n*4);
// 00000001000000010000000100000001
cout<<pow(2,24)+pow(2,16)+pow(2,8)+pow(2,0)<<endl;
for(int i=0;i<n;i++)
cout<<count[i]<<' ';
结果为
好的如我所料。。1也是吧每个字节都转为00000001然后得出的是00000001000000010000000100000001的值,因为int 只能存储到16843009故而是这个数字。。今天算是被网上的资料坑惨了。。
memset还是用来初始char数组和使int 数组置零用吧。。。
结果:1024个0
string类型
char str[10];
str[9] = 'w';
memset(str,97,9);
结果:a a a a a a a a a w
关于c++的 vector 容器的使用及创建方法
头文件:#include<vector>.
1、vector向量容器的使用,vector具有自动管理的功能,可以进行元素的查找删除
创建方法:
(1) vector<int > v;
创建了一个v的容器,没指定容量;
(2) vector<int> v(10);
创建了一个容量为10的容器;
(3) vector<int> v(10,520);
创建了一个容量为10的容器,并且对每个元素进行了初始化赋值 520
(4) 对其中的元素进行插入操作
原容器:2,3,5
进行插入,删除操作:
第一个元素前插入 8,第二个元素插入100,删除 第三个元素即第原来的第一个元素
1 v.insert(v.begin(), 8);
2 v.insert(v.begin() + 1, 100);
3 v.erase( v.begin()+2);
运行结果如下:
发现问题汇总
1、把问题想的太简单了点,还是经过缜密的思考,让逻辑上没有问题再落实吧,因为“自信”,浪费了好长一段时间。
2、{}这俩符号太多嵌套老是搞混,就很烦。。
3、表达方式可以更简洁一点:
例如:
if(count[i]>result)
result=count[i];
可以写成:result=max(result,count[i]);
总结
1个问题未解决
解决问题貌似慢了点啊,熟能生巧吧
看来网上的资料不能盲目相信,还是要自己验证。
今天时间紧就不用java再写一遍了。。之后会补上的。