java基础语法2

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/

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值