一.运算符
()[].-> !~ ++ -- &* /%* +- <<>>= = > < &|^ &&|| ?: = += -=
1. 优先级,简单记就是:! > 算术运算符 > 关系运算符 > && > || > 赋值运算符
2. 单目优于双目
3. 单目、条件、赋值是右左结合
4. !表示取非,对于整形变量,只要不为 0,使用 ! 取反都是 0,0 取反就是 1。就 像 bool 只有真假一样
5. ~取反,代表位的取反,对于整形变量,对每一个二进制位进行取反,0 变 1,1 变 0
6. ? : 三目运算
7. 源码、补码、反码
注意有符号和无符号的数运算有符号转无符号,运算的时候是补码运算,而不是源码,打印的时候看输出格式
#include<stdio.h>
int main()
{
int a = -7;
unsigned int b = 3;
if( (a + b) > 0) //如果打印‘+’说明 a+b > 0,即有符号转无符号运算的时候
{
printf("+\n"); //+
}
printf("%u\n",a + b); //4294967295
printf("%d\n",a + b); //-4
return 0;
}
-7
源码:1000 0000 0000 0000 0000 0000 0000 0111
反码:1111 1111 1111 1111 1111 1111 1111 1000
补码:1111 1111 1111 1111 1111 1111 1111 1001
8.%操作必须两边都是整数
9.三目运算符
int a = 2;
int b =3; b = 0 ? 1:(++a);
printf("%d\n",a); printf("%d\n",b); // 3 3
二.代码随想录 (数组理论)
数组是非常基础的数据结构,在面试中,考察数组的题目一般在思维上都不难,主要是考察对代码的掌控能力,也就是说,想法很简单,但实现起来 可能就不是那么回事了。
数组是存放在连续内存空间上的相同类型数据的集合。
需要两点注意的是
- 数组下标都是从0开始的。
- 数组内存空间的地址是连续的
正是因为数组的在内存空间的地址是连续的,所以我们在删除或者增添元素的时候,就难免要移动其他元素的地址。
数组可以方便的通过下标索引的方式获取到下标下对应的数据。但是数组的元素是不能删的,只能覆盖
三.coding part
1.leetcode 704 二分查找 难度 :简单
描述 :给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/binary-search
题解:
这道题目的前提是数组为有序数组,同时题目还强调数组中无重复元素,因为一旦有重复元素,使用二分查找法返回的元素下标可能不是唯一的,这些都是使用二分法的前提条件
同类型题 :leetcode 35插入位置搜索 难度 :简单
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
请必须使用时间复杂度为 O(log n)
的算法。 -----> 二分查找
要在数组中插入目标值,无非是这四种情况:
目标值在数组所有元素之前
目标值等于数组中某一个元素
目标值插入数组中的位置
目标值在数组所有元素之后
同类型题 :leetcode 34 在排序数组中查找元素的第一个和最后一个位置 难度:中等
给你一个按照非递减顺序排列的整数数组 nums
,和一个目标值 target
。请你找出给定目标值在数组中的开始位置和结束位置。
如果数组中不存在目标值 target
,返回 [-1, -1]
。
你必须设计并实现时间复杂度为 O(log n)
的算法解决此问题。