学校蓝桥杯的学习
- 进制
二进制:0b开头
八进制:0开头
十六进制:0X开头 - 进制转换:
系数:每一个位上的数
基数:这个数是几进制的,那么基数就是多少
权:从右往左,其下标值【从0开始递增】
转换规律:任意进制到十进制的转换等于数据各个位上的系数乘以基数的权次幂
且二进制遵循8421码,三位二进制为一个八进制,四位二进制为一个十六进制 - 有符号数据表示法 0正1负
计算机中存储有符号数的时候是按照补码的形式存入
正数的原码反码补码一样,而负数的反码是除符号不变,其他反转,补码则是反码基础上+1;
显示数字时,会将补码转换成原码【补码减一,得到反码再反转得到原码】 - 位运算(针对二进制)
&按位与 【同为1为1】双目
|按位或【有1为1】双目
^按位异或【不同为1,相同为0】双目
~按位取反【取反】单目
一个数据对相同数据异或两次其值不变==》加密
a^b^b==a;【】
按位异或的常见应用:实现值的交换
位运算的实现
【int a = 10; int b = 20; a = a^b; b=(a^b)^b;a=a^b;】
<<左移符号(左挤去,右补零)乘以2的几次幂 例 3<<2
>>右移符号(右挤去,左0补0,1补1(负数操作))除以2的几次幂
>>>无符号右移,空位置用0补充 - java代码的实现
主要方法
1.Integer.toBinaryString(int a) 将十进制值输出为二进制
2.Integer.toOctalString(int a)将十进制值输出为八进制
3.Integer.toHexString(int a) 将十进制值输出为十六进制
(十六进制可搭配toUpperCase()【将小写字母转换为大写字母】)
package com.company; import java.util.*; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int x = sc.nextInt(); System.out.println(Integer.toHexString(x).toUpperCase()); } }
4.Long.valueOf(String s,int radix) 将index进制的s转化为十进制输出 【s被解析字符,radix解释s使用的进制】
package com.company; import java.util.*; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); String x = sc.nextLine(); System.out.println(Long.valueOf(x,16)); } }
灵活运用上面的方法
- 排序的学习
1.冒泡法的思路:第一个和第二个比较,第二个和第三个比较以此类推,期间不断的进行比较,将最大/小值一直排到最后,第一个循环是小于数组长度-1【执行最后时,只剩下一个值无需比较了,所以只用执行数组的长度-1次】第二个循环是小于数组长度-1-第一次循环的次数【最后一个值在确定后就不会再去修改了,所以每次循环的条件都是在改变(减第一次循环的次数)】
2.二分查询的思路:定义一个有序的数组,然后取0为他的最小值,数组的长度-1为他的最大值,然后在确定一个中间值(low + high)/ 2【这里的除2一定会有值的】,然后输入一个值进入循环比较,当最小值小于等于最大值时进行循环【为什么可以等于?当最】
从小到大排序package com.company;
import java.util.Arrays;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
int[] arr = new int[N];
for(int i = 0; i < arr.length; i++){
arr[i] = sc.nextInt();
}
Arrays.sort(arr);
System.out.println(Arrays.toString(arr));
}
}
从大到小排序
package com.company;
import java.util.Arrays;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int[] arr = new int[3];
for(int i = 0; i < arr.length; i++){
arr[i] = sc.nextInt();
}
Arrays.sort(arr);
for(int i = 2; i >= 0; i--){
System.out.print(arr[i] + " ");
}
}
}输入反转
package com.company; import java.util.*; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); ArrayList<Integer> list = new ArrayList<>(); for(int a = sc.nextInt();a!=0;a=sc.nextInt()){ list.add(a); Collections.reverse(list); for (int i : list){ System.out.println(i + " "); } } } }冒泡查询 package com.company; import java.util.*; public class Main { public static void main(String[] args) { int[] a ={2,3,4,7,8,9,4,5,6}; for (int x = 0; x < a.length-1 ; x++){ for(int y = 0 ; y < a.length-1-x ; y++){ if(a[y] > a[y+1]){ int temp = a[y]; a[y] = a[y+1]; a[y+1] = temp; } } } System.out.println(Arrays.toString(a)); } }
二分查询 package com.company; import java.util.*; public class Main { public static void main(String[] args) { int[] a ={1,2,3,4,5,6,7,8,9}; Scanner sc = new Scanner(System.in); int low = 0; int high = a.length - 1; int x = sc.nextInt(); while(low <= high){ int middle = (low + high) / 2; if(a[middle] < x){ low = middle + 1; }else if(a[middle] > x){ high = middle - 1; }else { System.out.println("x的值对应下标为" + middle); break; } } if(low > high) { System.out.println("下标没有对应的值"); } } } ------------------------------------------------------------------------------ package com.company; import java.util.*; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); System.out.println("输入你想安排的元素个数"); int n = sc.nextInt(); int[] arr = new int[n]; System.out.println("输入有序的元素+空格不断键入"); for(int i = 0; i < n ; i++){ arr[i] = sc.nextInt(); } System.out.println("输入你想查询的数"); int key = sc.nextInt(); int indexNum = binary(arr,key); System.out.println("与key相等元素的下标为"+indexNum); } private static int binary(int[] arr, int a) { int low = 0; int high = arr.length - 1; int count = 1; while (low <= high){ System.out.println("第" + count + "次二分查询范围" + low + "------" + high); int mid = (low+high) / 2; if(arr[mid] == a){ return mid; }else if( arr[mid] > a){ high = mid - 1; }else { low = mid + 1; } count++; } return -1; } } ------------------------------------- public static void main(String[] args) { //必须为有序数组 int[] ints = new int[]{2,5,8,45,78,89}; System.out.println("输入你要查询的数:"); Scanner sc = new Scanner(System.in); int i = sc.nextInt(); String id = findnum(ints, i); if (id.equals(null)){ System.out.println("数组中没有该数字"); }else { System.out.println("你要查询的数的索引为" + id); } } private static String findnum(int arr[],int key) { int low=0; int high=arr.length-1; while (low<=high){ //找出中间索引 int mid=(low+high)/2; //比较中间索引上的值和要查找的值的大小 if (arr[mid]>key){ high=mid-1; }else if (arr[mid]<key){ low=mid+1; }else { return String.valueOf(mid); } } //未查找到返回null return null; }