[学习报告]《LeetCode零基础指南》(第四讲) 指针
一、今日知识点总结
1. 学习了指针的概念、如何定义指针、取地址、解引用等
2. 熟悉了vector相关操作
二、今日做题记录

法一:
空间换时间,将数组nums中的前n个元素即x1~xn取出暂存到数组temp中,然后按照规则将重新填入到nums数组中。
class Solution {
public:
vector<int> shuffle(vector<int>& nums, int n) {
//定义temp中的前n个元素为nums中的前n个元素
vector<int> temp(nums.begin(),nums.begin()+n);
for(int i = 0; i < 2 * n; i+=2){
nums[i] = temp[i / 2];
nums[i + 1] = nums[i / 2 + n];
}
return nums;
}
};
法二:
空间换时间,思想与法一类似,实现方法略有不同
class Solution {
public:
vector<int> shuffle(vector<int>& nums, int n) {
vector<int> ret(nums.begin(),nums.end());
for(int i = 0;i < 2*n;i++){
if(i&1){
//如果i为奇数
ret[i] = nums[n + i / 2];
}else{
//如果i为偶数
ret[i] = nums[(i+1) / 2];
}
}
return ret;
}
};
class Solution {
public:
vector<int> getConcatenation(vector<int>& nums) {
int size = nums.size();
for(int i = 0 ; i < size; i++){
nums.push_back(nums[i]);
}
return nums;
}
};
class Solution {
public:
vector<int> buildArray(vector<int>& nums) {
vector<int> ans(nums);
for(int i = 0; i < nums.size(); i++){
ans[i] = nums[nums[i]];
}
return ans;
}
};
法一:
class Solution {
public:
vector<int> runningSum(vector<int>& nums) {
vector<int> ans(nums);
for(int i = 0; i < nums.size(); i++){
ans[i] = nums[i];
if(i){
ans[i] += ans[i - 1];
}
}
return ans;
}
};
法二:
class Solution {
public:
vector<int> runningSum(vector<int>& nums) {
int n = nums.size();
for(int i = 1; i < n;i++){
nums[i] += nums[i-1];
}
return nums;
}
};
方法一:利用数学知识,将字符串进行翻转
class Solution {
public:
string reverseLeftWords(string s, int n) {
reverse(s.begin(),s.end());
reverse(s.end()-n,s.end());
reverse(s.begin(),s.end()-n);
return s;
}
};
方法二:利用数学知识,将字符串进行翻转
class Solution {
public:
string reverseLeftWords(string s, int n) {
reverse(s.begin(),s.begin()+n);
reverse(s.begin()+n,s.end());
reverse(s.begin(),s.end());
return s;
}
};
方法三:通过空间换时间,申请一个数组,将原数组中的数按要求复制到新数组中
char* reverseLeftWords(char* s, int k){
int i;
int n = strlen(s);
char *ret = (char*)malloc(sizeof(char)*(n+1));
for(int i = 0;i < n; i++){
ret[i] = s[(i + k) % n];
}
ret[n] = '\0';
return ret;
}
方法一: c++遍历字符串进行替换
class Solution {
public:
string defangIPaddr(string address) {
for(int i = 0; i < address.size();i++){
if(address[i] == '.'){
address.replace(i,1,"[.]");
i += 2;
}
}
return address;
}
};
方法二:使用c语言,利用char数组进行替换
char * defangIPaddr(char * address){
char *ret = (char*)malloc(sizeof(char)*1000);
int returnSzie = 0;
for(int i = 0;address[i];i++){
if(address[i] == '.'){
ret[returnSzie++] = '[';
ret[returnSzie++] = '.';
ret[returnSzie++] = ']';
}else{
ret[returnSzie++] = address[i];
}
}
ret[returnSzie] = '\0';
return ret;
}
方法一:使用c++库函数replace
class Solution {
public:
string replaceSpace(string s) {
for(int i = 0;i < s.size(); i++){
if(s[i] == ' '){
s.replace(i,1,"%20");
}
}
return s;
}
};
方法二:使用c语言申请char数组,遍历替换
char* replaceSpace(char* s){
char *ret = malloc( sizeof(char) * 30001 );
int retSize = 0;
for(int i = 0; s[i]; ++i) {
if(s[i] == ' ') {
ret[retSize++] = '%%';
ret[retSize++] = '2';
ret[retSize++] = '0';
}else {
ret[retSize++] = s[i];
}
}
ret[retSize] = '\0';
return ret;
}
C++双层for循环,直接暴力解
class Solution {
public:
vector<int> smallerNumbersThanCurrent(vector<int>& nums) {
vector<int> ret;
int n = nums.size();
for(int i = 0;i < n; i++){
int count = 0;
for(int j = 0;j < n; j++){
nums[j] < nums[i] ? count++ : count+=0;
}
ret.push_back(count);
}
return ret;
}
};
class Solution {
public:
vector<int> printNumbers(int n) {
vector<int> ret;
int max = pow(10,n);
for(int i = 1; i < max; i++){
ret.push_back(i);
}
return ret;
}
};
class Solution {
public:
vector<int> createTargetArray(vector<int>& nums, vector<int>& index) {
vector<int> target;
int n = nums.size();
for(int i = 0; i < n; i++){
target.insert(target.begin()+index[i],nums[i]);
}
return target;
}
};
三、今日收获
1.了解了如何在LeetCode提交带指针的题目,掌握了需要返回一维数组的题目的相关范式
2.了解到判断奇偶的一种新写法
if(i&1 == 1) 等价于if(i % 2 != 0) ,即表示如果i为奇数
if(I&1 == 0)等价于if(i%2 == 0),即表示如果i为偶数
四、今日疑问
无
五、其他参考
无
六、博文链接
无
相关推荐
leetcode第四题-LeetCode_Exercise:力扣_练习
leetcode 第四题力扣_练习 位掩码 结束了一些位操作和位掩码练习,难度由低到高总结了几道非常讲的位运算和位掩码题,难度由低到高 (简单的) (简单的) (强烈推荐) (中等的) (中)(强烈推荐) (中)(强烈推荐,即使你能想到每个元素出现4、5、6次而只有一个出现1次的问题,你怎么解决) (中)(强烈推荐) (难)(强烈推荐) 为什么我们需要使用Bitmask来处理一些棘手的问题? 原因1:位操作比'+-*/'等正常操作更快 原因2:位掩码可以帮助我们记录状态。 如果您使用 int 变量或布尔变量来存储状态,它将花费 4 个字节,因此您使用位 0/1 来存储状态,这将节省大量空间。 一些位掩码的操作: 1.记录状态 如果您有 8 个状态,则可以将位掩码设为 00000000,并使用“或 |” 操作以保存您的状态。 例如。 位掩码 = 00000000 new_state1 = 00001000 位掩码 | new_state1 = 00001000 这意味着已经记录了第四个状态 new_state2 = 00010001 位掩码 | new_state2 = 00011001
Leetcode:力扣个人代码C ++
Leetcode:力扣个人代码C ++
Leet Code_力扣原题_leetcode官网_
力扣网原题,可用于求职刷题,每个程序代码都正确。
leetcode题库-LeetCode:力扣题库练习
leetcode题库 LeetCode 力扣题库练习 中文网址: 美版网址:
leetcode:力扣刷题
密码 力扣刷题笔记 版本历史 0.1.0 关于作者 野子- 电子邮件:


