LC刷题记录1

仅作学习记录只用

9.回文数

转换为字符串

to_string函数,这是C++11新增的:C++11标准增加了全局函数std::to_string,以及std::stoi/stol/stoll等等函数(这几个就是string转int,long,以及long long啦~)
to_string这个函数还是很强大的!
string to_string (int val);
string to_string (long val);
string to_string (long long val);
string to_string (unsigned val);
string to_string (unsigned long val);
string to_string (unsigned long long val);
string to_string (float val);
string to_string (double val);
string to_string (long double val);

可以直接转换成string类,判断回文数

截断为前后两个整数进行判断

bool  isPalindrome(int x){
	bool mid=0;
	if(x<0||x%10==0&&x!=0) return false;//负数/末尾为0直接判错
	while(x>mid){
	mid=mid*10+x%10;
	x/=10;
	}
	return mid==x||mid/10==x;//奇/偶两种情况
}

14.最长公共前缀

利用str.find()==0判断该子串是否为前缀
str.find()==string::npos 判断是否存在该子串
str.find()==0 判断位置是否为0

695.岛屿最大面积

不用开矩阵vis[50][50],DFS时可以直接将遍历过的顶点值设为0,节省空间
注意gird.size()和grid[0].size()分别对应的是x/y

58.最后一个单词

字符串反转
reverse(str.begin(),str.end())

383.赎金信

提升时间复杂度:
l2长度小于l1长度时,必定需要判错

989.数组形式加法

巧妙利用截断,不用将k转换成vector
代码思路如下:

vector<int> addToArrayForm(vector<int>& A, int K) {
        vector<int> result;
        int lastNum=K,i=A.size()-1;
        while(i>=0||lastNum>0)
        {   
            //对应位相加
            if(i>=0)lastNum+=A[i--];

            //尾部数字添加到result中,同时k需要丢弃尾部数字
            result.push_back(lastNum%10);
            lastNum/=10;
        }
        //注意:要反转,因为低位数字都排在数组的前面了,所以需要反转
        reverse(result.begin(),result.end());
        return result;
    }

错误情况:

Line x: member access within null pointer of type 'struct TreeNode'

原因:在测试过程中,第x行访问的指针为NULL,通常情况下表明程序未对NULL情况作出判断。

121. 买卖股票的最佳时机

区间和可以转换成求差的问题,求差问题,也可以转换成区间和的问题。
即:
原数组两个元素的最大差等于求差数组的最大子序和!!!

125.验证回文串

利用内置函数+双指针

islower(char)是否为小写
isupper(char)是否为大写
isdigit(char)是否为数字
isalpha(char)是否为字母
isalnum(char)是否为数字/字母
toupper(char)字母小转大
tolower(char)字母大转小

只出现一次的数字

运用位运算

一个数和 0 做 XOR 运算等于本身: a⊕0 = a
一个数和其本身做 XOR 运算等于 0: a⊕a = 0
XOR 运算满足交换律和结合律: a⊕b⊕a = (a⊕a)⊕b = 0⊕b = b

int res = 0;
for(int i=0;i<len;i++){
    res ^= nums[i];  //与每一个数字进行异或运算
}
return res;

vector 构造函数

vector(int nSize)    创建一个vector,元素个数为nSize
vector(int nSize,const t& t)  创建一个vector,元素个数为nSize,且值均为t
vector(const vector&)  复制构造函数
vector(begin,end)  复制[begin,end)区间内另一个数组的元素到vector中

278.第一个错误的版本

二分法时:
int mid = (l+h)/2 ;可能会有溢出的问题

采用:
int mid = l + (h-l)/2; 避免产生溢出

459.重复的子字符串

假设给定字符串s可由一个子串x重复n次构成,即s=nx。
现构造新字符串t=2s,即两个s相加,由于s=nx,则t=2nx。
去掉t的开头与结尾两位,则这两处的子串被破坏掉,此时t中包含2n-2个子串。
由于t中包含2n-2个子串,s中包含n个子串,若t中包含s,则有2n-2>=n,可得n>=2,由此我们可知字符串s可由一个子串x重复至少2次构成,判定为true;反之,若t中不包含s,则有2n-2

vector push_back 和 emplace_back

emplace_back() 和 push_back() 的区别,就在于底层实现的机制不同。push_back() 向容器尾部添加元素时,首先会创建这个元素,然后再将这个元素拷贝或者移动到容器中(如果是拷贝的话,事后会自行销毁先前创建的这个元素);而 emplace_back() 在实现时,则是直接在容器尾部创建这个元素,省去了拷贝或移动元素的过程。

⚠️后者比前者快一倍以上

你可能感兴趣的:(leetcode/pat)