1. 进制转换
import java.util.*;
public class Main{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
String num = sc.nextLine();
System.out.println(tenToSixteen(Integer.parseInt(num)));
System.out.println(sixteenToTen(num.toUpperCase()));
}
public static String tenToSixteen(int num){
String ans = "";
while(num != 0)
{
int temp = num % 16;
char x = temp >= 10 ? (char)(temp - 10 + 'A') : (char)(temp + '0');
ans = x + ans;
num /= 16;
}
return ans;
}
public static int sixteenToTen(String num){
int ans = 0;
for(int i = 0;i < num.length();i++){
int temp = 0;
if(Character.isLetter(num.charAt(i)))
temp = num.charAt(i) - 'A' + 10;
else
temp = num.charAt(i) - '0';
ans = ans * 16 + temp;
}
return ans;
}
}
16进制与10进制互相转换
2. 方法抽象和逐步求精
当编写一个大程序时,可以使用“分治”策略,也称为“逐步求精”,将大问题分解成子问题,子问题又分解为更小、更容易处理的问题。
例:编写一个程序,显示给定的年月的日历。程序提示用户输入年份和月份,然后显示该月的整个日历,输出如下所示。
已知1800年1月1日为周三
2.1 自顶向下的设计
整个大问题可以分为两个问题:读取用户输入和输出该月日历
输出该月日历可分为两个问题:输出日历头和输出日历主体
输出日历头分为一个问题:将用户输入的月份转换为字符串
输出日历主体分为两个问题:1.判断第一天是星期几;2.判断这一个月共有多少天
1.判断这一天是星期几分为一个问题:计算1800年1月1日到这个月有几天,用结果加三再对7取余,得到今天是星期几
计算1800年1月1日到这个月有几天:需要判断1800到今年有几个闰年有几个平年
2.判断这一个月有几天:闰年2月29天,平年28天,其余相同
2.2 自顶向下的实现
import java.time.Month;
import java.util.*;
public class Calendar{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
System.out.println("enter the year:");
int year = sc.nextInt();
System.out.println("enter the month:");
int month = sc.nextInt();
printMonth(year,month);
}
public static void printMonth(int year,int month){
printMonthTitle(year,month);
printMonthBody(year,month);
}
public static void printMonthTitle(int year,int month){
String name = getMonthName(year,month);
System.out.println(" " + name + " " + year);
System.out.println("-----------------------------------");
System.out.println(" Sun Mon Tue Wed Thu Fri Sat");
}
public static String getMonthName(int year,int month){
String name = "";
switch(month){
case 1 : name = "Januray"; break;
case 2 : name = "February"; break;
case 3 : name = "March"; break;
case 4 : name = "April"; break;
case 5 : name = "May"; break;
case 6 : name = "June"; break;
case 7 : name = "July"; break;
case 8 : name = "August"; break;
case 9 : name = "September"; break;
case 10 : name = "October"; break;
case 11 : name = "November"; break;
case 12 : name = "December";
}
return name;
}
public static void printMonthBody(int year,int month){
int start = getStartDay(year,month);
int total = getNumberOfDaysInMonth(year,month);
for(int i = 0;i < start;i++){
System.out.print(" ");
}
for(int i = 1;i <= total;i++){
System.out.printf("%4d",i);
if((start + i) % 7 == 0) System.out.println();
}
}
public static int getStartDay(int year,int month){
int total = getTotalNumberOfDays(year,month);
return (total + 3) % 7;
}
public static int getTotalNumberOfDays(int year,int month){
int sum = 0;
for(int i = 1800;i < year;i++){
if(isLeapYear(i,month) == 1){
sum += 366;
}
else{
sum += 365;
}
}
for(int j = 1;j < month;j++){
sum += getNumberOfDaysInMonth(year,j);
}
return sum;
}
public static int getNumberOfDaysInMonth(int year,int month){
int num = 0;
switch(month){
case 1 :
case 3 :
case 5 :
case 7 :
case 8 :
case 10 :
case 12 : num = 31; break;
case 2 : num = 28 + isLeapYear(year,month); break;
case 4 :
case 6 :
case 9 :
case 11 : num = 30;
}
return num;
}
public static int isLeapYear(int year,int month){
if(year % 400 == 0 || (year % 4 == 0 && year % 100 != 0)) return 1;
return 0;
}
}
3. 数组
3.1 复制数组
1.使用循环逐个复制数组的元素
2.使用System类中的arraycopy方法
arrcopy(sourceArray,srcPos,targetArray,tarPos,length);
srcPos和tarPos表示源数组和目标数组的起始位置,length表示长度
int[] source = {1,2,3,4,5};
int[] target = new int[5];
System.arraycopy(source,0,target,0,5);
3.2 数组查找
1.线性查找
从左至右遍历数组
2.二分查找
对有序数组进行查找target
(1) 左闭右闭写法
public class Main{
public static void main(Stirng[] args){
int[] nums = {1,2,3,4,5};
int target = 2;
int left = 0,right = nums.length - 1;
while(left <= right)
{
int mid = left + (right - left) / 2;
if(nums[mid] < target) left = mid + 1;
else if(nums[mid] > target) right = mid - 1;
else return mid;
}
return -1;
}
}
(2)左闭右开写法
public class Main{
public static void main(Stirng[] args){
int[] nums = {1,2,3,4,5};
int target = 2;
int left = 0,right = nums.length - 1;
while(left < right)
{
int mid = left + (right - left) / 2;
if(nums[mid] < target) left = mid + 1;
else if(nums[mid] > target) right = mid;
else return mid;
}
return -1;
}
}
详见https://leetcode-cn.com/problems/search-insert-position/solution/er-fen-cha-zhao-qian-li-jie-by-lao-a-yi-idnu0/