算法涉及的常规方法总结一入门

感慨下:

最近和做算法的同学(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;//退出,继续外层循环
        }
    }
}    

持续更新维护-----------------------------------------》》》》》》

posted @ 2021-03-12 17:16  鼠标的博客  阅读(134)  评论(0编辑  收藏  举报