C++力扣知识点

char

1、char类型的1、2、3… 转为整形的问题:

//加入 想把char的6转为 int的6:
char c='6';
int a=c-'0';  // a即是int 的6
//反之,int 6转为 char 6
int a=6;
char c= a+'0';

链表

1、链表的新建
链表的定义一般如下:

struct ListNode {
   int val;
   ListNode *next;
   ListNode() : val(0), next(nullptr) {}  //空构造
   ListNode(int x) : val(x), next(nullptr) {}  //赋有值的构造
   ListNode(int x, ListNode *next) : val(x), next(next) {}  //赋有值和下一个元素的构造
 };

如果想要新建一个链表元素指针:

ListNode *pre1=new ListNode(-1)  // 赋有值的构造
ListNode *pre2=new ListNode(-1,pre1)  // 赋有值和下一个元素的构造

2、遍历链表使用的while循环内的条件
当遍历链表,如果只想对当前遍历,那么:

while(head!=nullptr){
}

如果是想对当前的next遍历,那么:

//错误的:
while(head->next!=nullptr){ //因为这是head有是nullptr的风险
}

//正确的:
while(head!=nullptr&&head->next!=nullptr){ //先保证head!=nullptr
}

string

1、反转一个string

string s="cjaajcl";
reverse(s.begin(),s.end());//直接反转两个指针即可

2、字符串中的字符表示

string s="qwcmcmal";
vector<int> ss(26,0);  //创建一个用于表示字母的数组,长度是26,次数初始化是0
for(char c:s){
	ss[c-'a']++; //这样可以表示出字符的相对位置,比如:c='b',c-'a'=1,即表示
}

3、string在某个索引处插入字符

string s="qqqqqqq";
s.insert(s.begin(),'a') // s : "aqqqqqqq" 插入到了最前面。
s.insert(s.begin()+1,'a') // s : "qaqqqqqq" 插入到了第一个字符的后面。

4、int转换成string

int a=88;
string s=to_string(a);

5、string分割字符串 (split)
看到的别人的思路:

// 分割字符串
vector<string> words;
string s;
for (int i = 0; i < str.size(); i++)
    if (str[i] == ' ') {   //按照 ‘ ’分割
        if (s.size())
            words.push_back(s);
            s = "";
    } else
        s += str[i];

if (s.size())
    words.push_back(s);

vector

1、合并两个vector
一种是vector的insert方法,一种是stl的merge方式,当然,还有遍列元素的方式。
vector的insert方式:(以下为将vec1和vec2的内容合并到vec3中)

vector<string>vec1,vec2,vec3;
//... vec1,vec2赋值
vec3.insert(vec3.end(),vec1.begin(),vec1.end());
vec3.insert(vec3.end(),vec2.begin(),vec2.end());

merge方式:

vector<string>vec1,vec2,vec3;
//... vec1,vec2赋值
sort(vec1.begin(),vec1.end());
sort(vec2.begin(),vec2.end());
vec3.resize(vec1.size()+vec2.size());
merge(vec1.begin(),vec1.end(),vec2.begin(),vec2.end(),vec3.begin());

merge方式要注意三点:
1、vec3需要指定好大小,不然会报错。
2、merge的时候指定vec3的位置一定要从begin开始,如果指定了end,它会认为没有空间,当然,中间的位置我没有试,回头有空试一下。

综上,我还是觉得对于合并vector来说,还是insert会比较简单一点,至于效率问题,就没有测试啦。

2、vector的assign方法

vector<int> v1={4, 9, 5};
v1.assign(10,100); //v1里面变成10个100,但是原来的4,9,5会被覆盖

3、vector 初始化成 m个n

vector<int> dp(8, 0);

这是dp中有8个0

4、在没有给vector指定内存空间时,不能使用vector[2] 这种下标方式访问数据
初始化办法:
一维:

vector<int> obj(size);
或
vector<int> obj;
obj.resize(size);

二维:

 vector<vector<int> > obj(rsize, vector<int>(lsize, 0));
或
vector<vector<int>> obj;
obj.resize(rsize);
 
for(int i = 0; i < rsize; i++)
    obj[i].resize(lsize);

当调用vector obj(size)时,调用构造函数 :

    
explicit vector(_CRT_GUARDOVERFLOW const size_type _Count, const _Alloc& _Al = _Alloc())
        : _Mypair(_One_then_variadic_args_t(), _Al) { // construct from _Count * _Ty(), optional allocator
        _Construct_n_copies_of_ty(_Count, _Value_init_tag{});
    }

当调用vector obj(size, 0)的时候,调用构造函数:

    vector(_CRT_GUARDOVERFLOW const size_type _Count, const _Ty& _Val, const _Alloc& _Al = _Alloc())
        : _Mypair(_One_then_variadic_args_t(), _Al) { // construct from _Count * _Val, optional allocator
        _Construct_n_copies_of_ty(_Count, _Val);

5、把一个set转化成vector

vector<int>(result_set.begin(), result_set.end());  //直接在地址上就转化

map

1、初始化一个map

unordered_map<int, int> frequency;
string s="ccaca";
for (char ch : s) { //这样每一个出现在s中的ch,都会被添加上1,下面有frequency[ch]++
	frequency[ch]++;
} 

c++语言知识

1、c++三目运算符

  int a=10,b=20,c=0;
//条件① 语句① 语句②
    c=a<b ? 1 : 2;
    cout << c << endl;

2、int 和小数的计算

int a=9;
double b=a/2; //这是b=4.0,因为a是int型,起码在计算之后 a/2是4.0,前面用double接收的也是4.0
double a=9;
double b=a/2; //这是b=4.5,因为a是double型,在计算之后 a/2就是4.5,

3、位运算
对于不能只用额外空间的题目,一般要考虑位运算了。
异或:
相同为0,不同为1。(参考力扣136)
c++的异或运算:

a=b^c;
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值