在小组的安排下,这个暑假我们统一学习三个星期的算法,在这里让我感觉最大的感受是,前面有人引你入门真的好,可以少走很多的冤枉路,可以快速增长自己的能力和水平,但后续就要求自己自主的学习,因为别人的路线毕竟是别人的,不可能完全的适合自己的,但入门系列是每一个程序员或爱好算法的同学的必经之路,入门系列就是基础阶段,只有将基础打好,后面才能走的更远更好。在完成入门系列专项训练之后,我将自己做的题和做题过程中遇到的问题及解题思路总结成笔记。
记得上数据结构的时候老师说过,数据结构好比是武林高手的内功,往往刚修炼的时候内功比较的弱,但当我们持之以恒的练习,我们终将练就一身内功成就宗师。加油!
人们在人生中需要做出许多选择,小到考虑晚上吃什么,大到决定高考志愿填报的学校。只有一次次选择后才能带来无限可能,我们要根据自己掌握的情况,做出最佳的选择。
程序的执行也不是一成不变的,往往会要求程序能够在不同的场合下有不同的动作。这时就需要在代码中使用条件语句来做出不同的选择。比如说,登录洛谷网时,网站后台会将你提交的用户名和密码在后台数据库中看看是否匹配,如果能够匹配就登陆成功,否则就登陆失败。这一章就来介绍如何让程序做出选择。
AC代码:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int x = sc.nextInt();
int a = 0, b = 0, c = 0, d = 0, m = 0;
if(x % 2 == 0){
m ++; //满足性质1
}
if(4 < x && x <= 12){
m ++; //满足性质2
}
if(m == 2){//满足两个性质
a = 1;
}
if(m>0){//至少满足一个性质
b = 1;
}
if(m == 1){//满足一个性质
c = 1;
}
if(m == 0){//一个性值都不满足
d = 1;
}
System.out.println(a + " " + b + " " + c + " " +d);
}
}
本题重点:
AC代码:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int year = sc.nextInt();
//对输入的年限进行判断
if(year % 100!=0 && year % 4 == 0 || year % 400 == 0){
System.out.println("1");
}else{
System.out.println("0");
}
}
}
本题重点
AC代码:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int x = sc.nextInt();
if(x == 0){
System.out.println("Today, I ate 0 apple.");
}
if(x == 1){
System.out.println("Today, I ate 1 apple.");
}
if(x > 1){
System.out.println("Today, I ate "+x+" apples.");
}
}
}
本题重点:
AC代码:
import java.util.*;
public class Main{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int a = sc.nextInt();
int sum1 = a * 5;//个人电脑上
int sum2 = a * 3 + 11;//洛谷题库
if(sum1 > sum2){
System.out.println("Luogu");
}else{
System.out.println("Local");
}
}
}
本题重点:
AC代码:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
double m = sc.nextDouble();
double h = sc.nextDouble();
double BMI = m/(h*h);//根据公式计算出BMI值
//当BMI小于18.5时。
if (BMI < 18.5){
System.out.println("Underweight");
}
//当BMI大于18.5小于24时。
if (18.5 < BMI && BMI < 24){
System.out.println("Normal");
}
//当BMI大于24时。
if (BMI > 24){
System.out.printf("%6.4f\n",BMI);//输入保留六位有效数字的数据
System.out.println("Overweight");
}
}
}
本题重点:
AC代码:
import java.util.Scanner;
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int a = sc.nextInt();
int b = sc.nextInt();
int c = sc.nextInt();
// int[] arr = new int[]{a,b,c};
// Arrays.sort(arr);
int middle = 0;
//三个数进行判断
if(a > b){ //a和b判断
middle = a;
a = b;
b = middle;
}
if(a > c){ //a和c判断
middle = a;
a = c;
c = middle;
}
if(b > c){ //b和c判断
middle = b;
b = c;
c = middle;
}
System.out.println(a+" "+b+" "+c);
// System.out.println(arr[0]+" "+arr[1]+" "+arr[2]);
}
}
本题重点:
AC代码:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int year = sc.nextInt();
int n = sc.nextInt();
//天数为31天的月份判断
if(n == 1 || n == 3 || n == 5 || n == 7 || n == 8 || n == 10 || n == 12){
System.out.println("31");
}
//天数为30天的月份判断
if(n == 4 || n == 6 || n == 9 || n == 11){
System.out.println("30");
}
//对二月进行单独的判断,是否是闰年
if(n == 2){
if(year % 100!=0 && year % 4 == 0 || year % 400 == 0){
System.out.println("29");//闰年
}else{
System.out.println("28");//非闰年
}
}
}
}
本题重点:
AC代码:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int[][] array = new int[7][2];
int temp = 0;
Integer[] arr = new Integer[7];
for (int i = 0; i < 7; i++) {
for (int j = 0; j < 2; j++) {
array[i][j] = sc.nextInt(); //各个时段的时间
}
arr[i] = array[i][0]+array[i][1];//定义数组,对应某一天的总时长
}
//通过比较得到最长的时间,若有两天去前面的。
for (int i = 0; i < 7; i++) {
if (i == 0){
temp = arr[0];
}else if(arr[i] > temp){
temp = arr[i];
continue;
}else {
continue;
}
}
if (temp<=8){//当最长的时间小于8时
System.out.println(0);
}else {//当最长的时间大于8时
for (int m=0;m<arr.length;m++){
if (arr[m] == temp){//这一操作是为了得到对应的天数
System.out.println(m+1);
return;
}
}
}
}
}
本题重点:
AC代码:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[] a = new int[3];
int[] b = new int[3];
int middle=0,sum,sum1,sum2;
for (int i = 0; i < 3; i++) {
a[i] = sc.nextInt();
b[i] = sc.nextInt();
}
//第一种方案
if(n % a[0] == 0){//当需要买的笔数正好是整盒的倍数时 下同
sum = b[0] * n / a[0];
}else{
sum = b[0] * (n / a[0]+1);//当需要买的笔数不是整盒的倍数时,需要多买一盒 下同
}
//第二种方案
if(n % a[1] == 0){
sum1 = b[1] * n / a[1];
}else{
sum1 = b[1] * (n / a[1]+1);
}
//第三种方案
if(n % a[2] == 0){
sum2 = b[2] * n / a[2];
}else {
sum2 = b[2] * (n / a[2] + 1);
}
//比较哪一种比较的便宜
if(sum > sum1){
middle = sum;
sum = sum1;
sum1 = middle;
}
if(sum >sum2){
middle = sum;
sum = sum2;
sum2 = middle;
}
System.out.println(sum);
}
}
本题重点、
为了公平起见,所有的笔都买同一款。
正确的输入数据,然后对三种方案都进行计算,比较哪一种比较的便宜就用哪一种方案。
这里主要注意的点就是,包装的铅笔不散卖,所以要买只能整盒的买。这里就要判断所要买的套装是否和需要购买的铅笔的数量匹配,然后进行计算。
AC代码:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
double sum = 0;
if (n <= 150){
sum = n * 0.4463;
String num = String.format("%.1f",sum); //保留一位小数
System.out.println(num);
}else if (n <= 400){
sum = 150 * 0.4463 + (n - 150)*0.4663;
// String num = String.format("%.1f",sum);
System.out.printf("%.1f",sum); //保留一位小数
}else{
sum = 150 * 0.4463 + (400 - 150)*0.4663 + (n - 400)* 0.5663;
String num = String.format("%.1f",sum); //保留一位小数
System.out.println(num);
}
}
}
AC代码:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int x = sc.nextInt();//输入周几
int n = sc.nextInt();//输入航行的天数
int sum = 0;
for (int i = 0; i < n ; i++) {
if(x != 6 && x != 7){//判断是否是周六周日
sum += 250;
}
if(x == 7){//当周日的时候就将x变为1
x = 1;
}else{
x++;
}
}
System.out.println(sum);
}
}
本题重点:
AC代码:
import java.util.Scanner;
public class Main {
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int a = sc.nextInt(),b= sc.nextInt(),c= sc.nextInt();
int max=Math.max(Math.max(a,b),c);//得到最大的数
int min=Math.min(Math.min(a,b),c);//得到最小的数
int gongyinshu = 1;
for (int i = 1; i < min; i++) {//遍历得到最大的公因数
if (min % i == 0 && max % i == 0){//能同时被整除的书肯定是公因数,随着i增加,最后那个能被整除的数就是最大公因数。
gongyinshu = i;
}
}
System.out.println(min/gongyinshu+"/"+max/gongyinshu);
}
}
本题重点:
AC代码:
import java.util.Arrays;
import java.util.Comparator;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int a = sc.nextInt();
int b = sc.nextInt();
int c = sc.nextInt();
Integer[] arr = new Integer[]{a,b,c};//将三边存入数组中
Integer[] n = sort(arr);//使用sort()方法对数组进行排序。这个是自己写的,本身就有Arrays.sort()这个方法进行升序排序
//不能组成三角形
if (n[0]+n[1] <= n[2]){
System.out.println("Not triangle");
System.exit(0);//当构成不了三角形就得结束,否则将进行下面的操作,可能会符合一些要求
}
//锐角三角形
if ((n[0]*n[0]+n[1]*n[1]) > n[2]*n[2]){
System.out.println("Acute triangle");
}
//直角三角形
if ((n[0]*n[0]+n[1]*n[1]) == n[2]*n[2]){
System.out.println("Right triangle");
}
//钝角三角形
if ((n[0]*n[0]+n[1]*n[1]) < n[2]*n[2]){
System.out.println("Obtuse triangle");
}
//等腰三角形
if(n[0].equals(n[1])){
System.out.println("Isosceles triangle");
}
//等边三角形
if((n[0].equals(n[1])) && n[1].equals(n[2])){
System.out.println("Equilateral triangle");
}
}
public static Integer[] sort(Integer[] arr){
Arrays.sort(arr, 0, arr.length, new Comparator<Integer>() {
public int compare(Integer o1, Integer o2) {
return o1 - o2;
}
});
return arr;
}
}
本题重点
AC代码:
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 < 3; i++) {
arr[i] = sc.nextInt();//输入相关的数据
}
String str = sc.next();//输入字符串
Arrays.sort(arr);//按照题意的要求进行升序排序
System.out.println(arr[str.charAt(0) - 65] +" "+ arr[str.charAt(1) - 65] +" "+ arr[str.charAt(2) - 65]);//根据输入的字符串的顺序依次输出相对应的数据
}
}
本题重点:
AC代码:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
// 接受输入,处理字符串
Scanner input = new Scanner(System.in);
String isbn = input.nextLine();// 获得输入的ISBN
// 处理数据
char isbnArray[] = isbn.toCharArray();// 将ISBN转换为char数组
int sum = (isbnArray[0] - '0') + (isbnArray[2] - '0') * 2 + (isbnArray[3] - '0') * 3
+ (isbnArray[4] - '0') * 4 + (isbnArray[6] - '0') * 5 + (isbnArray[7] - '0') * 6
+ (isbnArray[8] - '0') * 7 + (isbnArray[9] - '0') * 8 + (isbnArray[10] - '0') * 9;
int result = sum % 11;//按照题中要求对数据进行求余。模数:11;
if (result != 10) {
if ((isbnArray[12] - '0') != result) {// 如果识别码错误
isbnArray[12] = (char)(result + '0');// 改为正确的值
System.out.println(isbnArray);
} else {
System.out.println("Right");
}
} else {// 特殊情况,余数为10时
if (isbnArray[12] == 'X') {// 如果是X则正确
System.out.println("Right");
} else {
isbnArray[12] = 'X';// 改为正确的值
System.out.println(isbnArray);
}
}
}
}