题目跳转
1.3275 骑车与走路
2.3388 分拣
3.3277 判断闰年
4.3273 被3,5,7整除
5.3271 输出绝对值
6.3268 等差数列的末项
7.3415 A+B V2
8.3429 条件输出5
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可以创建 动态的字符串
*/
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 后面只能放 常量(或者常量表达式)
*/
public class 被3_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');
}
}
}
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的感觉
*/
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);
}
}
/*
已知两个非负整数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));
}
}
/*
编程实现输入两个整数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('---------------------------------')
//不使用以上三种写法
}
}