java 51nod

1.3275 骑车与走路

2.3388 分拣

3.3277 判断闰年

4.3273 被3,5,7整除

5.3271 输出绝对值

6.3268 等差数列的末项

7.3415 A+B V2

8.3429 条件输出5

3275 骑车与走路

public class 骑车与走路_3275{
    
    
    public static void main(String[] args){
    
    
        panduan();
    }

    public static void panduan(){
    
    
        //首先是输入的问题
        java.util.Scanner s=new java.util.Scanner(System.in);
        int a=s.nextInt();

        if((50+a/3.0)>a/1.2){
    
    
            System.out.println("Walk");
        }else if((50+a/3.0)<a/1.2){
    
    
            System.out.println("Bike");
        }else if((50+a/3.0)==a/1.2){
    
    
            System.out.println("All");
        }
    }
}

3388 分拣
这次真的是给我写吐了,我不断的将我的代码改进,始终不能通过,最后参考了一下这位大神的代码发现我的问题,不是自身的代码,而是数据转换过多.就是说我最开是接收的数据为String类型,无法强转类型转换为int类型,所以就查了一些方法采用Integer.parseInt(String)将类型进行转换,而每个循环都这样,相当于每一次都执行了一个----方法----,导致时间复杂度过高.下次注意

package java题库.nod51;

/*
    工厂里有一些分拣物件的工作,其中一名工人的工作是将面前传送带上依次送来的n个物件按照物件上的标号
    分别放到向左、向右两条传送带上,奇数的向左,偶数的向右。直到这一批物件分拣完,组长检查无误后打包装箱。
    身为组长的小明自知责任重大,每次工人分拣完后他都会立即停下传送带,从工人左侧传送带的最左端开始核查物件的标号,直到
    查到工人右侧传送带上最右端,以确认是否分拣正确。已知物件传送过来的顺序,小明希望你帮忙记录一个关于物件标号的数字序列,
    表示他应当核查到物件的顺序,以便迅速完成工作。

    输入:第一行输入一个数n,表示物件总数;第二行输入n个数,表示依次送来的n个物件上的标号。
    输出:输出一行n个数,表示小明应核查到的正确的物件顺序,以空格隔开。
    数据范围:对于100%的数据,1≤n≤100000,0≤物件标号≤10^9;
    输入样例
    6
    1 2 3 4 5 6
    输出样例
    1 3 5 6 4 2
*/

//如果是python应该怎么做,让他输入得到一个列表,遇到奇数的输出,遇到偶数的入栈(就是个列表)
//等到把列表全部循环一遍,开始出栈

import java.util.*;
public class 分拣_3388{
    
    
    public static void main(String[] args){
    
    
        看了人家的代码做的修改();
    }
    public static void fenjian(){
    
    

        //吐了提交运行超时,不过也该,写了两边循环

        //用来接收输入
        Scanner s=new Scanner(System.in);
        //接收输入的n
        System.out.print("请输入n");
        int n=s.nextInt();


        //接收输入的字符串,他们中间以空格隔开
        System.out.print("请输入这n个数");
        Scanner d=new Scanner(System.in);
        String str=d.nextLine();

        //使用split,以空格作为分割符,获得字符串数组
        String[] strs=str.split(" ");

        //这里采用第三种方法建立int类型数组(声明数组时指定元素个数然后赋值)
        int[] nums=new int[n];

        //开始for循环将变量放入数组中

            //这个变量是用来记录偶数个数
        int ou=0;
        for(int a=0;a<n;a++){
    
    
            //我想到了一个方法,记录偶数的个数
            //在这个过程中将偶数放到一个新的数组中(但是你不知道这个数组的长度)
            //但是一定小于n,所以你可以先放进去,之后再一个循环给他拿出来
            //说实话挺蠢的,等我java学的好一点,一定要搞一个动态的和python的list
            //一样的东西
            int b=Integer.parseInt(strs[a]);
            if(b%2!=0){
    
    //奇数输出
                System.out.printf("%d ",b);
            }else{
    
    
                nums[ou]=b;
                ou+=1;
            }
        }
        //再来个循环把偶数全部输出
        for(int a=ou-1;a>=0;a--){
    
    
            System.out.printf("%d ",nums[a]);
        }

    }


    //我突然想到了一个好办法,一个从左往右跑输出奇数,一个从右往左跑输出偶数,一个循环就能把奇数偶数全部输出
    //因为奇数一定要先输出完
    //所以拿一个字符串变量,将他们拼接到一起
    public static void fen_String(){
    
    

        //运行还是超时,这个的时间复杂度应该是o(n)
        //细算的话是o(2n),当然其实你只需要走路程的一半,这样所有的数其实都已经走过了
        //所以再优化一下

        //用来接收输入
        Scanner s=new Scanner(System.in);
        //接收输入的n
        System.out.print("请输入n");
        int n=s.nextInt();


        //接收输入的字符串,他们中间以空格隔开
        System.out.print("请输入这n个数");
        Scanner d=new Scanner(System.in);
        String str=d.nextLine();

        //使用split,以空格作为分割符,获得字符串数组
        String[] strs=str.split(" ");

        //创建两个String类型的变量,进行拼接
        String ji="";
        String ou="";
        //从右往左跑所需要的变量
        int len=n-1;
        for(int a=0;a<n;a++){
    
    
            //从左往右
            int b=Integer.parseInt(strs[a]);

            //从右往左
            int c=Integer.parseInt(strs[len]);
            if(b%2!=0){
    
    
                ji=ji+b+" ";
            }
            if(c%2==0){
    
    
                ou=ou+c+" ";
            }
            len-=1;
        }
        //当循环结束将他们拼接在一起输出
        System.out.println(ji+ou);


    }

    public static void 优化_string() {
    
    

        //运行还是超时,这个的时间复杂度应该是o(n)
        //细算的话是o(2n),当然其实你只需要走路程的一半,这样所有的数其实都已经走过了
        //所以再优化一下

        //用来接收输入
        Scanner s = new Scanner(System.in);
        //接收输入的n
        System.out.print("请输入n");
        int n = s.nextInt();


        //接收输入的字符串,他们中间以空格隔开
        System.out.print("请输入这n个数");
        Scanner d = new Scanner(System.in);
        String str = d.nextLine();

        //使用split,以空格作为分割符,获得字符串数组
        String[] strs = str.split(" ");

        //创建两个String类型的变量,进行拼接
        String ji_left="";
        String ji_right="";
        String ou_left="";
        String ou_right="";
        //从右往左跑所需要的变量
        int right =n-1;
        //从左往右跑所需要的变量
        int left=0;
        while(left<right){
    
    //需要注意一下,这里不包括中间变量,需要判断是奇数个元素还是偶数个
            //从左往右
            int b =Integer.parseInt(strs[left]);
            //从右往左
            int c=Integer.parseInt(strs[right]);
            if (b%2!=0){
    
    
                ji_left=ji_left+b+" ";
            }else{
    
    
                //偶数怎么办
                ou_left=" "+b+ou_left;
            }
            if (c%2==0){
    
    
                ou_right=ou_right+c+" ";
            }else{
    
    
                //奇数怎么办
                ji_left=" "+b+ji_left;
            }

            left+=1;
            right-=1;
        }
        //当循环结束将他们拼接在一起输出
        if(n%2==0) {
    
    
            System.out.println(ji_left+ji_right+ou_right+ou_left);
        }else{
    
    
            int zhongjian=Integer.parseInt(strs[n/2]);
            if(zhongjian%2==0){
    
    
                System.out.println(ji_left+ji_right+ou_right+zhongjian+ou_left);
            }else{
    
    
                System.out.println(ji_left+zhongjian+ji_right+ou_right+ou_left);
            }

        }
    }
    public static void 人家的代码() {
    
    
        Scanner input=new Scanner(System.in);
        int n,i,k,j;
        StringBuilder sb=new StringBuilder();
        n=input.nextInt();
        int num[]=new int[n];
        int numAft[]=new int[n];
        for(i=0;i<n;i++)
        {
    
    
            num[i]=input.nextInt();
        }
        for(i=0,k=n-1,j=0;i<n;i++)
        {
    
    
            if((num[i]&0x1)==1)
            {
    
    
                numAft[j++]=num[i];
            }else
            {
    
    
                numAft[k--]=num[i];
            }
        }
        for(i=0;i<n;i++)
        {
    
    
            sb.append(Integer.toString( numAft[i]));
            sb.append(" ");
        }
        System.out.println(sb);

        input.close();
    }

    public static void 看了人家的代码做的修改() {
    
    
        //用来接收输入
        Scanner s = new Scanner(System.in);
        //接收输入的n

        int n = s.nextInt();


        //接收输入的字符串,他们中间以空格隔开


        //创建数组
        int[] nums=new int[n];
        //循环将数据接收
        for(int a=0;a<n;a++){
    
    
            nums[a]=s.nextInt();
        }


        //创建两个String类型的变量,进行拼接
        String ji = "";
        String ou = "";
        //从右往左跑所需要的变量
        int len = n - 1;
        for (int a = 0; a < n; a++) {
    
    
            //从左往右
            int b =nums[a];

            //从右往左
            int c =nums[len];
            if (b % 2 != 0) {
    
    
                ji = ji + b + " ";
            }
            if (c % 2 == 0) {
    
    
                ou = ou + c + " ";
            }
            len -= 1;
        }
        //当循环结束将他们拼接在一起输出
        System.out.println(ji + ou);
    }
}

/*
    对于Scanner类对象:
        1.可以用 next() 和 nextLine()方法获取输入的字符串
        2.next():
            --一定要读取到有效字符后才可以结束输入
            --对于有效字符之前遇到的空白,next()方法会自动将其去掉
            --只有输入有效字符后才将后面输入的空白作为分隔符或者结束符
            --next()不能得到带有空格的字符串
        3.nextLine():
            --以Enter为结束符,也就是说nextLine()方法返回的是输入回车之前的所有字符
            --可以获得空白


    创建数组的三种方式:
        1、声明并赋值
            int[] arr = {1,2,4, …};
            注意:这里的花括号不是语句块,而且而且花括号后的分号也不能省,…不是元素意思是可以指定多个元素
        2.声明数组名开辟空间并且赋值
            int[] arr;
            arr = new int[]{1,2,3, …};
        3.三、声明数组时指定元素个数然后赋值
            int[] arr1= new int[3];
            注意:最大元素下标为2,并且所有的元素值均为0
            赋值一般用for循环
        4.在以上的基础上创建多维数组
            int[][] arr = {
    
    {1,2,3},{4,5,6},{7,8,9}}; //每个子数组元素个数不要求均相同
            int[][] arr = new int[m][n]; //其中n可以省略,在创建的时候可以指定
            int[][][] arr = new int[m][n][q]; //同样其中n、q可以省略
        总结:
            无论那种方法声明必须有 :数据类型 [ ] , 如:int[ ]
            创建多维数组时,new后面的第一个方括号中的元素数量总不能省略
            “new 数据类型[]{}”创建数组时,其中花括号可以省去,但要在“[ ]”中填写数组的个数


        String类型数据不能通过:
            String a="123"
            int b=(int)a;直接强制性类型转换


        不知道为什么?
            //用来接收输入
            Scanner s=new Scanner(System.in);
            //接收输入的n
            System.out.print("请输入n");
            int n=s.nextInt();
            //接收输入的字符串,他们中间以空格隔开
            System.out.print("请输入这n个数");
            String str=s.nextLine();
            这样是只能输入一次,就是说nextLine()会把前面输入的也接收(可能是同一个引用,保存了数据,再加上
            nextLine()会把---------所有的拿出来---------
	StringBuilder可以创建   动态的字符串

*/


3277 判断闰年

public class 判断闰年_3277{
    
    
    public static void main(String[] args){
    
    
        run();
    }
    public static void run(){
    
    
        //简单的用if语句判断一下就好了
        //算了if语句用的已经够多了用三元运算符和switch吧

        //键盘输入
        java.util.Scanner s=new java.util.Scanner(System.in);
        int a=s.nextInt();

        //首先判断是否为普通闰年
        switch(a%4){
    
    
            case 0:
                //首先为400的倍数一定为4的倍数所以普通闰年,世纪闰年都能进来
                if (a%100!=0){
    
    
                    System.out.println("Y");
                }else if(a%400==0){
    
    
                    System.out.println("Y");
                }else{
    
    
                    System.out.println("N");
                }
                //记着break;一下不然default一定会执行(紧挨在一起的原因)
                break;
            default:
                System.out.println("N");
        }
    }
}

/*
        case 后面只能放 常量(或者常量表达式)
 */

3273 被3,5,7整除

public class3_5_7整除_3273{
    
    
    public static void main(String[] args){
    
    
        toswitch();
    }
    public static void toif(){
    
    
        //键盘输入
        java.util.Scanner s=new java.util.Scanner(System.in);
        int n=s.nextInt();
        int panduan=0;
        //按照输出顺序,3,5,7依次判断
        if(n%3==0){
    
    
            System.out.printf("%d ",3);
            panduan=1;
        }
        if(n%5==0){
    
    
            System.out.printf("%d ",5);
            panduan=1;
        }
        if(n%7==0){
    
    
            System.out.printf("%d",7);
            panduan=1;
        }

        //上面写了三个if,即每一个都要判断一遍,这是正确的
        //但这导致了我无法判断,他们是否都没执行
        //所以我决定加一个变量[panduan]来判断是否都没执行了
        if(panduan==0){
    
    
            System.out.print('n');
        }
    }

    public static void toswitch(){
    
    
        //这里是尝试下switch的写法
        //我觉得需要循环判断,原因是每次只能放一个数字,当然你可以像上面一样

        //键盘输入
        java.util.Scanner s=new java.util.Scanner(System.in);
        int n=s.nextInt();


        //创建数组
        int[] nums={
    
    3,5,7};
        int panduan=0;
        for(int a=0;a<nums.length;a++){
    
    
            switch(n%nums[a]) {
    
    
                case 0:
                    System.out.printf("%d ",nums[a]);
                    panduan=1;
                    break;
            }
        }
        if(panduan==0){
    
    
            System.out.println('n');
        }
    }
}

3271 输出绝对值

package java题库.nod51;
/*
    输入一个浮点数,输出这个浮点数的绝对值。
    输入:输入一个浮点数,其绝对值不超过10000。
    输出:输出这个浮点数的绝对值,保留到小数点后两位(四舍五入)。
    输入样例:-3.14
    输出样例:3.14

    首先的想法是if语句判断 正,负
    正数直接输出
    负数用0-输出
    主要是如何保存2位小数
 */
public class 输出绝对值_3271{
    
    
    public static void main(String[] args){
    
    
        //从键盘接收元素
        java.util.Scanner s=new java.util.Scanner(System.in);
        System.out.println("请输入:");
        double a=s.nextDouble();
        if(a>=0){
    
    //可以直接输出
            System.out.printf("%.2f",a);
        }else{
    
    
            System.out.printf("%.2f",0-a);
        }
    }
}

/*
    需要注意的点:
        如果想要格式化输出 ----"%.2f",a----需要使用printf
        不能使用println,或print.这个pringf有种print.format的感觉

 */

3268 等差数列的末项

public class 等差数列的末项_3268{
    
    
    public static void main(String[] args){
    
    
        java.util.Scanner s=new java.util.Scanner(System.in);
        int a1=s.nextInt();
        int a2=s.nextInt();
        int n=s.nextInt();
        int d=a2-a1;
        System.out.println(a1+(n-1)*d);
    }
}

3415 A+B V2

/*
	已知两个非负整数A,B,请你求出A+B的值并输出这个加法算式。
*/
class ABV2_3415{
    
    
	public static void main(String[] args){
    
    
		//键盘输入
		java.util.Scanner s=new java.util.Scanner(System.in);
		long a=s.nextLong();
		long b=s.nextLong();
		System.out.println(a+"+"+b+"="+(a+b));
	}
}

3429 条件输出5

/*
	编程实现输入两个整数a,b,当a≥b时,输出a的值,否则输出0。
	你知道如何不使用 if,switch以及 3 目运算符,来解决这个问题么?
*/
import java.io.*;
import java.util.*;
 
public class 条件输出5_3429{
    
    
   public static void main(String[] args){
    
    


	   //接收键盘输入
	   Scanner s=new Scanner(System.in);
	   int a=s.nextInt();
	   int b=s.nextInt();

//if语句写法
	   if(a>=b){
    
    
			System.out.println(a);
	   }else{
    
    
			System.out.println(0);
	   }
	

	   System.out.println('---------------------------------')



//switch写法,因为只能判断是否相等所以需要转化
		switch(a/b){
    
    
			//若a>=b则b/a为0或1
			case 0:case 1:
				System.out.println(a);
				break;
			default:
				System.out.println(0);
		}

		System.out.println('---------------------------------')

//三目运算符写法
		System.out.println(a>=b ? a:0);

		System.out.println('---------------------------------')

//不使用以上三种写法
		

   }
}

猜你喜欢

转载自blog.csdn.net/qq_53183608/article/details/119655317
今日推荐