算法很美 java基础篇 基本数据类型 数值型 整数类型
byte 一个字节 -128 ~ 127 short 二个字节 -2^15 ~ 2^15 - 1 int 四个字节 -2^31 ~ 2^31 - 1 32位处理器 long 八个字节 -2^63 ~ 2^63 - 1
浮点数据类型
float 四个字节 -3.403E38 ~ 3.403E38 double 八个字节 -1.798E308 ~ 1.798E308
字符类型
char Unicode编码 0 ~ 65535 0x0000 ~ 0xffff
布尔类型
boolean 值 true false
常量(字面量) 整型 十进制数 正常人们所用的数字 5 21 13 14
八进制数 用0开头表示 05 021 013 014
十六进制数 用0x或0X开头表示 0x5 0x21 0x13 0x14
二进制数(java7开始) 用0b开头表示 0b5 0b21 0b13 0b14
字面量加下划线(java7开始) 用下划线表示便于阅读 1_000_000 一百万
浮点数 十进制
float 521.1314f 或 5211314.0F double 521.1314 5211314.0
科学计数法
52113.14e2 52113.14E2 52113.14E-2
转义字符
转义字符
含义
'
单引号字符
"
双引号字符
\
反斜杠字符
\t
垂直制表符
\b
退格
\r
回车
\n
换行
\f
换页
变量 标识符 数字字母下划线美元符 中文可以 但是不推荐基本可以省略 关键字不能使用
算术运算符 +
加-
减*
乘/
除%
求模/取余++
自增--
自减 整数被除0会产生一个异常 浮点数被除0会产生一个无穷大或NaN
逻辑运算符 &&
逻辑与 都真为真
||
逻辑或 有真为真
!
逻辑非 真为假 假为真
三元运算符 Love ? lucky : regretful
love 为 true lucky
love 为 false regretful
如果 爱 为真 是 幸运的 否则 遗憾的
位运算 位运算符 &
与运算符 都为1 结果为 1
|
或运算符 有一个为1 结果为 1
^
异或运算符 二者不同时结果为 1 任何数同自己异或为0 同0异或为自己 连续和同一个因子做异或运算 最终结果为自己
~
非/取反运算符 1 结果为 0 0结果为 1
a
b
~a
a&b
a或b
a^b
1
1
0
1
1
0
0
1
1
0
1
1
0
0
1
0
0
0
>>
右移运算符 用符号位填充高位
<<
左移运算符
>>>
用0填充高位
例 int类型 1 << 35 和 1 << 3 相同 因为int类型时32为 所以对32求模相同
long类型对64求模
简单的求奇偶数 1 2 3 4 5 6 7 8 public static void main (String[] args) { int num; num = new Random().nextInt(100 ); System.out.println(num + "是" + ((num & 1 ) == 1 ? "奇数" : "偶数" )); }
思路: 奇数的二进制最后一位一定是1 偶数的二进制最后一位一定是0 所以与1进行与运算即可
获取二进制某一位是0还是1 1 2 3 4 5 6 public static void main (String[] args) { int num = 86 ; System.out.println(num + "的二进制第五位是" + (((num >> 4 ) &1 ) == 1 ? "1" : "0" )); }
交换两个变量的值 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 public static void main (String[] args) { int a; int b; a = new Random().nextInt(100 ); b = new Random().nextInt(100 ); System.out.println("a = " + a + "\t" + "b = " + b); System.out.println("交换后" ); a = a ^ b; b = a ^ b; a = a ^ b; System.out.println("a = " + a + "\t" + "b = " + b); }
不用判断语句 求整数绝对值 1 2 3 4 5 public static void main (String[] args) { int num = -521 ; System.out.println("num的绝对值为" + ((num ^ (num >> 31 )) + (num >>> 31 ))); }
赋值运算符
操作符
用法案例
等价表达式
+=
a+=b
a = a + b
-+
a-=b
a = a - b
*=
a*=b
a = a * b
/=
a/=b
a = a / b
%=
a%=b
a = a % b
类型转化 自动类型转换 小类型转换成大类型
强制类型转换 大类型转换成小类型
案例 不调用系统的Date和Calendar API 输出当前系统时间 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 public static void main (String[] args) { long time = System.currentTimeMillis(); long miao = time / 1000 ; long locationMiao = miao % 60 ; long fen = miao / 60 ; long locationFen = fen % 60 ; long shi = fen / 60 ; long locationShi = shi % 24 ; System.out.println("当前系统时间为:" + (locationShi + 8 ) + "时" + locationFen + "分" + locationMiao + "秒" ); }
随机数 1 Math.random() 随机返回[0 ,1 ) 之间的一个double 行浮点数 Math在lang包下 不用导包
字符进制转换问题 整数转换成16进制0至15以内 1 2 3 4 5 6 7 8 public static void main (String[] args) { int x; Scanner scanner = new Scanner(System.in); System.out.println("请输入0~15的整数" ); x = scanner.nextInt(); System.out.println(x + "的十六进制为" + (x > 9 ? (char )('A' + (x - 10 )) : (char )('0' + x))); }
字符串 String 引用数据类型 字符串 和 整数相加 就是拼接
String的常用方法 自行查阅API 常用的方法必须会
控制流程 顺序结构 分支结构 循环结构 案例 闰年问题 能被4整除且不能被100整除 或者能被400整除
1 2 3 4 5 6 7 8 9 10 11 12 13 public static void main (String[] args) { Scanner scanner = new Scanner(System.in); System.out.println("请输入一个年份" ); int x = scanner.nextInt(); if (x < 1582 ){ System.out.println("输入的是错误信息 在1582年之前公里还未被采用" ); }else if ((x % 4 == 0 && x % 100 != 0 ) || (x % 400 == 0 )){ System.out.println(x + "是润年" ); }else { System.out.println(x + "不是闰年" ); } }
十六进制转换成十进制问题 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 public static void main (String[] args) { Scanner scanner = new Scanner(System.in); System.out.println("请输入一个0~9 A~F a~f 我们来给您转换成十进制数" ); String x = scanner.next(); char result = x.charAt(0 ); if (x.length() >= 2 ){ System.out.println("您输入的有误" ); return ; } if (result >= 48 && result <= 57 ){ System.out.println(result + "的十进制数为" + result); }else if (result >= 'A' && result <= 'F' ){ System.out.println(result + "的十进制数为" + (result - 'A' + 10 )); }else if (result >= 'a' && result <= 'f' ){ System.out.println(result + "的十进制数为" + (result - 'a' + 10 )); } }
十六进制转十进制(任意十六进制) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 public static void main (String[] args) { Scanner scanner = new Scanner(System.in); System.out.println("请输入一个十六进制数" ); String x = scanner.next(); char [] arr = x.toCharArray(); int result = 0 ; for (int i = 0 ; i < arr.length; i++){ char x1 = arr[i]; int x11 = x1 - '0' ; if (x1 >= 'A' && x1 <= 'F' ){ x11 = x1 - 'A' + 10 ; } if (x1 >= 'a' && x1 <= 'f' ) { x11 = x1 - 'a' + 10 ; } result += x11 * (int )(Math.pow(16 ,arr.length - i - 1 )); } System.out.println(result); }
十进制转十六进制(任意十进制数) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 public static void main (String[] args) { Scanner scanner = new Scanner(System.in); System.out.println("请输入一个十进制数" ); int x = scanner.nextInt(); int yushu = 0 ; char weizhi = 0 ; String result = "" ; String newResult = "" ; while (x != 0 ){ yushu = x % 16 ; x = x / 16 ; if (yushu > 9 ){ weizhi = (char )('A' + yushu - 10 ); }else { weizhi = (char )('0' + yushu); } result += weizhi; } for (int i = result.length() - 1 ; i >= 0 ; i--){ newResult += result.charAt(i); } System.out.println("0x" + newResult); }
十进制转二进制 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 public static void main (String[] args) { Scanner scanner = new Scanner(System.in); int yushu = 0 ; int x; int y; int count = 0 ; while (true ){ System.out.println("请输入一个十进制数" ); try { x = scanner.nextInt(); y = x; }catch (Exception e){ System.out.println("输入有误 程序运行终止" ); return ; } String result = "" ; String newResult = "" ; count = 0 ; if (x < 0 ){ x = (int ) (Math.pow(2 ,31 ) + x); } if (x == 0 ){ newResult += 0 ; } while (x != 0 ){ yushu = x % 2 ; x = x / 2 ; count++; if (count % 4 == 0 ){ result += yushu; result += "_" ; }else { result += yushu; } } while (count < 31 ){ count++; if (count % 4 == 0 ){ result += 0 ; result += "_" ; }else { result += 0 ; } } if (y < 0 ){ result += 1 ; }else if (y > 0 ){ result += 0 ; } for (int i = result.length() - 1 ; i >= 0 ; i--){ newResult += result.charAt(i); } System.out.println(newResult); } }
随机数和循环的应用 随机生成字符串 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 public static void main (String[] args) { Scanner scanner = new Scanner(System.in); System.out.println("请输入您要生成的字符串长度" ); int x = scanner.nextInt(); int i = 0 ; String result = "" ; while (i < x){ char c = (char ) (Math.random() *(0xffff + 1 )); if ((c > '0' && c < '9' ) || (c > 'a' && c < 'z' ) || (c > 'A' && c < 'Z' )){ result += c; i++; } } System.out.println("生成的随机字符串为:" + result ); }
PI的近似值 1 2 3 4 5 6 7 8 9 10 11 public static void main (String[] args) { double result = 0 ; for (int i = 1 ; i <= 100000 ; i++) { result += Math.pow(-1 ,i+1 ) / (double )(2 * i - 1 ); } System.out.println(4 * result); }
回文串 回文串就是正序和反序一致
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 public static void main (String[] args) { Scanner scanner = new Scanner(System.in); System.out.println("请输入一个字符串" ); String result; result = scanner.next(); int begin = 0 ; int end = result.length() - 1 ; while (begin < end && result.charAt(begin) == result.charAt(end)){ begin++; end--; } System.out.println(result + ((begin >= end) ? "" : "不" ) + "是一个回文串" ); }
最大公约数问题 最大公约数:指两个或多个整数共有约数中最大的一个
两个整数 4 和 2 的最大公约数是 2
两个整数 16 和 24 的最大公约数是 8
普通算法 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 public static void main (String[] args) { Scanner scanner = new Scanner(System.in); System.out.println("请输入两个正整数" ); int x = scanner.nextInt(); int y = scanner.nextInt(); if (x > y){ x = x ^ y; y = x ^ y; x = x ^ y; }else if (x == y){ System.out.println(x + "和" + y + "的最大公约数是" + x); return ; } if (y % x == 0 ){ System.out.println(x + "和" + y + "的最大公约数是" + x); return ; } int gcd = 1 ; for (int i = x / 2 ; i >= 1 ; i--){ if (x % i == 0 ){ gcd = i; break ; } } System.out.println(x + "和" + y + "的最大公约数是" + gcd); }
欧几里德算法 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 public static void main (String[] args) { Scanner scanner = new Scanner(System.in); System.out.println("请输入两个正整数" ); int x = scanner.nextInt(); int y = scanner.nextInt(); if (x > y){ x = x ^ y; y = x ^ y; x = x ^ y; }else if (x == y){ System.out.println(x + "和" + y + "的最大公约数是" + x); return ; } if (y % x == 0 ){ System.out.println(x + "和" + y + "的最大公约数是" + x); return ; } while (y % x != 0 ){ int temp = x; x = y % x; y = temp; } System.out.println(x + "和" + y + "的最大公约数是" + x); }
简单的随机生成数封装 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 public static char randomChar (char a, char b) { if (a < b){ return (char ) (a + (int )(Math.random() * (b - a +1 ))); }else { return (char ) (a + (int )(Math.random() * (a - b + 1 ))); } } public static char randomLowercase () { return randomChar('a' ,'z' ); } public static char randomCapital () { return randomChar('A' ,'Z' ); } public static char randomNumber () { return randomChar('0' ,'9' ); } public static String randomnumberString (int length) { StringBuilder stringBuilder = new StringBuilder(); for (int i = 0 ; i < length; i++){ stringBuilder.append(randomNumber()); } return stringBuilder.toString(); } public static String randomLowercaseString (int length) { StringBuilder stringBuilder = new StringBuilder(); for (int i = 0 ; i < length; i++){ stringBuilder.append(randomLowercase()); } return stringBuilder.toString(); } public static String randomCapitalString (int length) { StringBuilder stringBuilder = new StringBuilder(); for (int i = 0 ; i < length; i++) { stringBuilder.append(randomCapital()); } return stringBuilder.toString(); } public static String randomLetterAndNumber (int length) { StringBuilder stringBuilder = new StringBuilder(); for (int i = 0 ; i < length; i++) { int random = (int )(Math.random() * 3 ); char x = ' ' ; switch (random){ case 0 : x = randomNumber(); break ; case 1 : x = randomLowercase(); break ; case 2 : x = randomCapital(); break ; } stringBuilder.append(x); } return stringBuilder.toString(); } public static void main (String[] args) { System.out.println(randomChar('a' ,'z' )); System.out.println(randomLowercase()); System.out.println(randomCapital()); System.out.println(randomNumber()); System.out.println(randomnumberString(10 )); System.out.println(randomLowercaseString(10 )); System.out.println(randomCapitalString(10 )); System.out.println(randomLetterAndNumber(10 )); }
你懂得越多 你不懂的越多 嘿 我是小博 带你一起看我目之所及的世界……