JAVA-Details02

本文章仅用于记录学习Java时遇到的部分细节(02偏补充细节学习) - Felix


>java万能头文件

import java.util.*;

> nextLine连用的坑

  • next
  • nextInt
  • nextDouble
  • nextFloat

这些函数与nextLine连用都会有坑:next系列的函数返回了数据后,会把回车符留在缓冲区,因此我们下一次使用nextLine的时候就会碰到读取空字符串的情况

补充:next()读取过滤空格键      nextLine()会连空格键一起读取

解决方案:

  • 都用nextLine,做格式转换
  • 调用next系列函数后,中间调用一次nextLine去掉回车符后,再调用一次nextLine读取
//eg1 :
Scanner in = new Scanner(System.in);
int num = Integer.parseInt(in.nextLine()); //格式转换
String str = in.nextLine;

//eg2 :
Scanner in = new Scanner(System.in);
int num = in.nextInt();
in.nextLine();
String str = in.nextLine();

> 在小规模处理中,swith效率会比hash快


> 二分查找

  • mid=(left+right)>>1的含义
    右移运算符>>,运算结果正好能对应一个整数的二分之一值,这就正好能代替数学上的除2运算,但是比除2运算要快。
    mid=(left+right)>>1相当于mid=(left+right)/2
  • mid写成 l+(r-l)/2 而非 (l+r)/2
    当数组元素很多时,(l+r)计算结果可能会大于INT_MAX,导致溢出


> ASCII码

  • 空格的ASCII码为32
  • 0~9的ASCII码为48~57
  • A~Z的ASCII码为65~90
  • a~z的ASCII码为97~122

> 求min之类先定的值

int ans = Integer.MAX_VALUE;

> 字符串位数转换限制

在 Java 中:

  • 如果字符串超过 33 位,不能转化为 Integer
  • 如果字符串超过 65 位,不能转化为 Long
  • 如果字符串超过 500000001 位,不能转化为 BigInteger

> 判断重复字符

  • 可以用一种数据结构来判断是否有重复的字符,常用的数据结构为哈希集合(即 C++ 中的 std::unordered_set,Java 中的 HashSet,Python 中的 set, JavaScript 中的 Set)。
  • 在左指针向右移动的时候,我们从哈希集合中移除一个字符,在右指针向右移动的时候,我们往哈希集合中添加一个字符。

> 位运算符 & ~ | ^

位运算符主要针对二进制,它包括了:“与”、“非”、“或”、“异或”,分别用”&”、”~”、” | “、”^”。其中:

  • 与运算(&)两个操作数的位都为 1,结果才为 1,否则结果为 0。
  • 非运算(~)的操作数的位如果为 0,结果是 1,如果为 1,结果是 0。
  • 或运算(|)两个操作数的位只要有一个为 1,那么结果就是 1,否则就为 0。
  • 异或运算(^)的两个操作数的位相同时结果为 0,不同时结果为 1。
if (right1 == null ^ right2 == null) {
    return false;
}

eg:此处要取得情况是 right1 == null && right2 != null || right1 != null && right2 == null
可用异或运算 right1 == null ^ right2 == null 巧妙处理


> 最短/长问题思路

最短距离——BFS(广度优先遍历)
最长距离——DFS(深度优先遍历)


> BFS(广度优先遍历)

BFS 使用队列,把每个还没有搜索到的点依次放入队列,然后再弹出队列的头部元素当做当前遍历点。BFS 总共有两个模板:

1.如果不需要确定当前遍历到了哪一层:

while queue 不空:
    cur = queue.pop()
    for 节点 in cur的所有相邻节点:
        if 该节点有效且未访问过:
            queue.push(该节点)

2.如果要确定当前遍历到了哪一层:
这里增加了 level 表示当前遍历到二叉树中的哪一层了,也可以理解为在一个图中,现在已经走了多少步了。size 表示在当前遍历层有多少个元素,也就是队列中的元素数,我们把这些元素一次性遍历完,即把当前层的所有元素都向外走了一步。

level = 0
while queue 不空:
    size = queue.size()
    while (size --) {
        cur = queue.pop()
        for 节点 in cur的所有相邻节点:
            if 该节点有效且未被访问过:
                queue.push(该节点)
    }
    level ++;

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值