巧妙的代码写法

162 阅读2分钟

取出来直接判断

while ('\n' != (c = (char)inputStream.read())){
}

用下标存储不重复的数

有局限:

1、输入的数作为下标、存储的数不能太大不然浪费空间

2、如果数值范围1-1000、因为下标存值所以要多一位

3、boolean[] stu = new boolean[1001]; 默认值为FALSE、存储哪个数数则把对应下标的内容FALSE->TRUE

int totalTime = Integer.parseInt(str);
boolean[] stu = new boolean[1001];
for (int i = 0; i < totalTime; i++) {
    stu[Integer.parseInt(bf.readLine())] = true;
}

image.png

StringBuilder去除多余的那个连接符

image.png

image.png

StringBuilder sb = new StringBuilder();
for (int i = arr.length - 1; i >= 0; i--) {
    sb.append(arr[i]).append(" ");
}
System.out.println(sb.substring(0, sb.length() - 1));
StringBuilder sb = new StringBuilder();
for (int i = arr.length - 1; i >= 0; i--) {
    sb.append(" ").append(arr[i]);
}
sb.deleteCharAt(0);
System.out.println(sb.toString());
StringBuilder sb = new StringBuilder();
for (int i = arr.length - 1; i >= 0; i--) {
    sb.append(arr[i]).append(" ");
}
sb.deleteCharAt(sb.length()-1);
System.out.println(sb);
StringBuilder sb = new StringBuilder();
for (int i = 0; i < orderTotal; i++) {
    sb.append(intArr[i]).append(" ");
}
System.out.println(sb.toString().trim());

不满8位补0

最后长度不够8的补0可以用如下两种方式

1、先用0占位、然后用存在的数据把0替换掉、

int len = str.length();
int start = 0;
while (len >= 8) {
    System.out.println(str.substring(start, start + 8));
    start += 8;
    len -= 8;
}
if (len > 0) {
    char[] tmp = new char[8];
    for (int i = 0; i < 8; i++) {
        tmp[i] = '0';
    }
    for (int i = 0; start < str.length(); i++) {
        tmp[i] = str.charAt(start++);
    }
    System.out.println(String.valueOf(tmp));
}

2、在存在的数据后面直接补0

int len = str.length();
int start = 0;
while (len >= 8) {
    System.out.println(str.substring(start, start + 8));
    start += 8;
    len -= 8;
}
if (len > 0) {
    StringBuilder sb = new StringBuilder(str.substring(str.length() - len));
    for (int i = len; i < 8; i++) {
        sb.append(0);
    }
    System.out.println(sb);
}

进制转10进制

    private static Map<Character, Integer> map = new HashMap<Character, Integer>() {
        {
            put('0', 0);
            put('1', 1);
            put('2', 2);
            put('3', 3);
            put('4', 4);
            put('5', 5);
            put('6', 6);
            put('7', 7);
            put('8', 8);
            put('9', 9);
            put('A', 10);
            put('B', 11);
            put('C', 12);
            put('D', 13);
            put('E', 14);
            put('F', 15);
            put('a', 10);
            put('b', 11);
            put('c', 12);
            put('d', 13);
            put('e', 14);
            put('f', 15);
        }
    };
int res = 0; 
for (char ch : "0xAA".substring(2).toCharArray()) { 
    res = res * 16 + map.get(ch); 
} 
System.out.println(res);
int sum = 0;
for (int i = "AA".length() - 1; i >= 0; i--) { 
    char c = "AA".charAt(i); 
    sum = sum + map.get(c) * (int)Math.pow(16, length - 1 - i); 
} 
System.out.println(sum);

length - i - 1 这个指针的用法要熟悉、而且脑子里要想象的出来


求质数因子

long k = (long) Math.sqrt(num);

for (long i = 2; i <= k; ++i) {
    while (num % i == 0) {
        System.out.print(i + " ");
        num /= i;
    }
}
System.out.println(num == 1 ? "" : num);

1、num % i == 0 表示 num可以整除i

2、System.out.println(num == 1 ? "" : num); 输入1没有质数整除就返回本身、过了num平方根以后还没有质数整除、那就返回它本身

3、时间复杂度logN的场景

浮点型数据、小数点后一位来决定四舍五入

double number = Double.parseDouble(str); 
System.out.println((int)(number + 0.5));

float number = Float.parseFloat(str); 
System.out.println((int)(number + 0.5));

1、类型转换就是向下取整、很巧妙的利用这种方式

image.png