感慨下:
最近和做算法的同学(java web中途转的)聊天,闻知他现在仍然在持续刷题保持状态,甚是敬佩,算法是保持脑袋灵活的好方
法,就像以前喜欢做数学题一样,纯粹。数学讲基础和逻辑,一层层递进的理论。不理解整数,分数,小数,计算不会好;不熟
悉一元一次方程,因式分解,那基本上高阶和多元方程,指数,对数方程也不要想;三角函数推理证明过程不理解,想记忆公式
就吃力;我没有专门刷过算法题目,所以对自学的数据结构,算法思想,不能像以前做数学题那样可以做到看题目就能在脑海里
过一遍思路,只用关心写出规范的解题步骤。所以准备像我的那位同学一样,从入门,初级开始做起,一点点积累,以下是我的
一些总结,仅作记录小本本
一、输入输出
Scanner in = new Scanner(System.in)
nextInt(),nextLong(),nextFloat(),nextDouble():直至读取到空格或回车之后结束,读取到的数值;对应判断使用hasNextInt()
牛客上的对nextXXX的解释有点复杂,这里有个我认为比较简单的方法:
假设"有效字符"指我们常用的StringUtils.isEmpty()为true的字符,那么空格,大片空白,换行符都是非有效字符
hasNext(),next():就是一直读取,遇到"非有效字符"前,读到的String值,
hasNextLine(),nextLine():一直读,直到读取到非有效字符中换行符这种情形(说明:遇到空格还是继续读完)
一组数据直接next,确定多少组数据直接for,不确定用while
二、数学计算
Math
Math.pow(r,3)求立方
Math.sqrt(x),求平方根
Math.ceil():向上取整
Math.floor():向下取整
Math.round():四舍五入
Math.max(n3, Math.max(n1, n2)):求三个数字中的最大值
求余
m%100:求数字的各个位数用除以10的倍数取余数
位运算
1<<n:计算2的n次方
(n&1)==0 判断偶数,true表示偶数
格式化
String.format("%.2f",f):保留小数位数
String.format("%04d",i):i前面补齐0成为4位
进制转换
10进制转 2进制 String Integer.toBinaryString(int i);
10进制转 8进制 String Integer.toOctalString(int i);
10进制转 16进制 String Integer.toHexString(int i);
10进制转 r 进制 String Integer.toString(int i, int r);
r进制转 10进制 Integer Integer.parseInt(String s,int r);-----》》
note:这里注意s一般会含有进制的标记,如16进制的0x,要substring(2),截取后面的
计算二进制中1的个数:int Integer.bitCount(int i);
三、字符串操作
String.trim():注意这里会去掉收尾空格
String.split():注意分隔符是元字符(. + * 等)时需要加上转义符
String.substring:使用频率很高
String.valueOf():int值或char[]
String.toCharArray():转char数组
字符和ASCII码互转:(int)char,(char)int
字符串反转:StringBuilder. reverse
是否包含某个字符(字符串):String.contains(Charsequence c)
字符是否是数字:Character.isDigit(char or int) 或 if(c>=’0’ && c<=’9’);
字符是否是字母:Character.isLetter(char or int) 或 if(((c>='a'&&c<='z') || (c>='A'&&c<='Z')))
是否是小写字母:Character.isLowerCase(char ch) 或 if(c>=’a’ && c<=’z’);
字母大写转小写: Character.toLowerCase() 或 char(c+32)
字母小写转大写:或 Character.toUpperCase() 或 char(c-32)
数字字符转数字:int i = char c-'0'
char字母后移N个位置:c = char(c+N)
总结一个位移规律:未超过尾时正常位移,超过后从头部开始
接上,按字母表顺序移动N次,超过z之后从a开始,按数学规律:
ASCII码表:都是26个字母,a-z是97-122,A-Z是65-90,当前对应的码值假设是x,那就是
(x+N-97)%26+97
比如y:121->3位,(121+3-97)%26+97= 98(也就是b)----------这是超过z的情况
比如k:107->4位,(107+4-97)%26 + 97 = 111(也就是o)------这是没超过z的情况
更一般的公式:(当前位置+移动位置-首位置)% 定长 + 首位置=移动后所处位置
四、集合操作
对List<Integer> 排序:
从小到大:Collections.sort(list)
反转排序: Collections.reverse(list)----------注意这个不是倒序!
从小到大:Arrays.sort(int[] a)
计算数组中数字之和:int total = Arrays.stream(nums).sum();
五、循环
for(int i=0;i<n;i++){}
for(int i=1;i<=n;i++){}
for(int i=arr.length-1;i>=0;i--){}
发现一个规律,如果是跟线性结构相关的下标或者索引数字,循环最好从0开始,
如果i是一个实实在在的有含义的值,一般从1开始循环,条件用小于等于
A111B:要求逐个遍历,遇到数字时如果是连续的,需要作为整体遍历,类似需求:
for(int i=0;i<str.length;i++){ //balabalabala .... //碰到了数字 i++; while(i < str.length()){ if (Character.isDigit(str.charAt(i))) { numberStr += str.charAt(i); i++; }else{ i--; //这里上次++了,要--回去 break;//退出,继续外层循环 } } }
持续更新维护-----------------------------------------》》》》》》