2018-11-27——第二天

序言

一个实验就要求自学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再写一遍了。。之后会补上的。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值