zoukankan      html  css  js  c++  java
  • 算法涉及的常规方法总结一入门

    感慨下:

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

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

  • 相关阅读:
    学校的SQLServer的笔记
    Javaの集合学习
    XML的学习
    Java中学校没学过的东西
    MySQL的学习
    牛顿法及其收敛性
    c++编码规范
    C++标准库
    MATLAB编程技巧
    Matlab学习记录(函数)
  • 原文地址:https://www.cnblogs.com/yb38156/p/14517262.html
Copyright © 2011-2022 走看看