力扣.H指数力扣.字母异位词力扣.289生命游戏力扣452.用最小数量的箭引爆气球力扣.86分隔链表力扣.轮转数组
目录
^判断是否两边相同
short类型
思维:语义化,借助常量
力扣.H指数
力扣.字母异位词
力扣.289生命游戏
力扣.86分隔链表
^判断是否两边相同
byte一个字节8位
short类型
- 大小:
short
类型占用2个字节(16位)的内存空间。int:
- 大小:
int
类型占用4个字节(32位)的内存空间。long:8个字节 64位
- 大小:long类型占用8字节(64位)内存空间
float:32位
double:64位
3.4默认是double类型,不能给float赋值
char的底层是unicode,unicode是包含中文的
&&和&的区别,
&&左边得到结果,不会计算右边
&不论左边如何,都会计算右边
标识符:
字母,数字,下划线,美元符号
首位不能是数字
区分大小写
不能是关键字和保留字、首位不可以是数字,区分大小写
变量,数据类型,运算:变量和常量,标识符,编码规范
三元: ? :
两个数字n,m
假如交换可以进行n+m,然后操作n-m,m-n之类的操作。
二进制:
对于数据的保存都是采用二进制
规则:0,1
<<左移n位,等价乘以2的n次幂
>>,>>>右移,无符号右移,等价除以2的n次幂a
switch支持的数据类型,int,byte,short,char String,enum
case后面跟常量,必须是唯一常量
switch中break作用的中断,假如不去中断,则后面不会进行判断,而是一直去执行
思维:语义化,借助常量
比如定义男女
使用boolean
开始先用两个常量
final boolean MAN=true;final boolean WOMAN=false;后面定义的时候,就可以比如boolean a=MAN;作为这个语义化
8个小球,一个比较重,其余一样,如何称两次找到重的
分为3,3,2组,把3个,3个两个比较,哪个重,其余就容易
一个5L杯子,一个3L杯子,怎么称4L的水
5L倒满,给3L,此时还剩2L,然后把3L杯子水倒没,把2L给3L水杯,之后,5L加满,给3L直到填满,此时剩4L.
力扣.H指数
class Solution {public int hIndex(int[] citations) {int h=0;int n=citations.length;Arrays.sort(citations);// 0,0,0,1,2,3,5,6h=0;int i=n-1;while(i>=0&&citations[i]>h){//假如cit[i]当前位置比h大,就说明当前位置至少是H+1次,所以,需要h进行++;h++;i--;}return h;}
}
力扣.字母异位词
这个我思路是不明确的,想到了排序,但是假如我写,肯定没有这么便捷,
他的思路是,不管你什么异位词,我排序之后,你的所有异位词长的都是一个样子,所以我只需要让你所有的都进行排序,拿排序好的那个,作为key,因为假如是异位词,他排序之后的单词应该是一致的,因此这个作为key,然后List来去存储。
class Solution {public List<List<String>> groupAnagrams(String[] strs) {Map<String,List<String>>map=new HashMap<String,List<String>>();for(int i=0;i<strs.length;i++){char[]array=strs[i];Arrays.sort(array);String key=new String(array);//不用判断是否相同,get(获取这个key)假如获取到了就返回,没获取到就new一个,反正这个一定是属于这个字符串的List<String>list=map.getOrDefault(key,new ArrayList<String>);list.add(strs[i]);map.put(key,list);}}
}
力扣.289生命游戏
这个生命游戏是很牛马的一个题目,俺以为他会一直变化,没想到只变化一层,他是一层之后,我们进行第一层,然后根据前面的那些变化,为什么要设置2和-1这俩个状态表示原先死了变活和原先活着变死了,是因为我们更改的同时,需要的是第一波的状态,我们需要得到原先是0还是1,其余就是正常了。
class Solution {public void gameOfLife(int[][] board) {int[] neighbors = {0, 1, -1};int rows = board.length;int cols = board[0].length;// 遍历面板每一个格子里的细胞for (int row = 0; row < rows; row++) {for (int col = 0; col < cols; col++) {// 对于每一个细胞统计其八个相邻位置里的活细胞数量int liveNeighbors = 0;for (int i = 0; i < 3; i++) {for (int j = 0; j < 3; j++) {
//0,1,-1if (!(neighbors[i] == 0 && neighbors[j] == 0)) {// 相邻位置的坐标int r = (row + neighbors[i]);int c = (col + neighbors[j]);
//这步之前是来统计当前坐标的8个方位,然后把这个点除了本身,全部给处理掉,每个点都统计一下//-1表示过去是活的,现在死了,2表示过去死了,现在活了//r和c要在合法范围内 查看相邻的细胞是否是活细胞if ((r < rows && r >= 0) && (c < cols && c >= 0) && (Math.abs(board[r][c]) == 1)) {liveNeighbors += 1;}}}}// 规则 1 或规则 3 if ((board[row][col] == 1) && (liveNeighbors < 2 || liveNeighbors > 3)) {// -1 代表这个细胞过去是活的现在死了board[row][col] = -1;}// 规则 4if (board[row][col] == 0 && liveNeighbors == 3) {// 2 代表这个细胞过去是死的现在活了board[row][col] = 2;}}}// 遍历 board 得到一次更新后的状态for (int row = 0; row < rows; row++) {for (int col = 0; col < cols; col++) {if (board[row][col] > 0) {board[row][col] = 1;} else {board[row][col] = 0;}}}}
}
力扣.86分隔链表
链表多多利用头节点,要舍得定义变量。
/*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}* ListNode(int val) { this.val = val; }* ListNode(int val, ListNode next) { this.val = val; this.next = next; }* }*/
class Solution {public ListNode partition(ListNode head, int x) {ListNode preHead = new ListNode();preHead.next = head;ListNode cur = head;// 4,3,2,5,2 此时没有找到我的preListNode pre = preHead;ListNode key = head;while (cur != null) {if (cur.val >= x) {key = cur;cur = cur.next;break;}pre = cur;cur = cur.next;}//相当于找到了所有比他小的节点的后一个节点,我此时还需一个比他小的节点的前一个节点ListNode Precur=key;//此时比他小的开头节点是pre,比他大的节点是key,我只需要往下找,假如比他小的,插入二者之间即可 1243while (cur != null) {if (cur.val < x) {ListNode next = cur.next;pre.next = cur;cur.next = key;pre = pre.next;Precur.next=next;cur = next;} else {Precur=cur;cur = cur.next;}}return preHead.next;}
}