JAVA编程考试

本文提供了一系列编程挑战的解决方案,涉及字符串修改、数组处理、向量运算等,通过Java实现,展示了不同类型的算法题解思路。

题目描述:

给定长度为n的只有小写字母的字符串s,进行m次操作,每次将[l,r]范围内所有c1字符改成c2,输出操作完的字符串
输入描述;
第一行两个数n,m
第二行一个字符串s
之后m行,每行两个数lz两个字符cl c2
输出描述:
输出一行一个字符串
示例1输入输出示例仅供调试,后台判题数据一般不包含示例

输入:

5 3
wxhak
3 3 h x
1 5 x a
1 3 w g

输出

gaaak

代码:

import java.util.Scanner;

public class Main {

    public static void main(String[] args) {            
         Scanner sc = new Scanner(System.in);
            int n = sc.nextInt();
            int m = sc.nextInt();
            String str = sc.next();
            char c[] = str.toCharArray();

            for (int i = 0; i < m; i++) {
                int l = sc.nextInt();
                int r = sc.nextInt();
                char c1 = sc.next().charAt(0);
                char c2 = sc.next().charAt(0);
                for (int j = l - 1; j < r; j++) {
                    if (c[j] == c1) {
                        c[j] = c2;
                    }
                }
            }
            String s = "";
            for (int i = 0; i < n; i++) {
                s += c[i];
            }
            System.out.println(s);        

    }

}

题目描述
ruby很喜欢吃蘑条。
有一天,她拿出了n根薯条,第i根遘条的长度为ai。
ruby认为,若两根薯条的长度之差在和r之间,则认为这两根薯条有“最萌身高差”。用数学语言描述,即若l≤∣ai-aj∣≤r,则第i根薯条和第j根薯条有“最萌身高差”。
注:次序不影响统计,即认为(ai,aj)和(aj,ai)为同一对。
输入描述;
第一行三个正整数n,i,r,含义见题目描述。( 1<n<200000, 1<l<r<1e9
第二行n个正整数ai,分别代表每根薯条的长度。(1<ai<1e9)
输出描述:
一个正整数,代表,代表”最萌身高差"的薯条对数。
示例1输入输出示例仅供调试,后台判题数据一般不包含示例
输入
5 2 3
3 1 6 2 5
输出

4

代码

import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
         Scanner sc = new Scanner(System.in);
            int n = sc.nextInt();
            int l = sc.nextInt();
            int r = sc.nextInt();
      
            int[] a = new int[n]; 
            for (int i=0;i<n;i++)
            {
                a[i]=sc.nextInt();
            }
     
         int count=0;
      
         for (int i=0;i<a.length;i++)
         {
             int ai=a[i];
              for (int j=i+1;j<a.length;j++)
              {                  
                  int aj=a[j];                  
                  if (aj>ai)
                  {
                    if   (l<=(aj-ai)&& (aj-ai)<=r)
                        count++;
                  }
                  else if (aj<ai)
                  {

                      if   (l<=(ai-aj)&& (ai-aj)<=r)
                            count++;
                      
                  }                  
                  
              }
         }
         System.out.println(count);

    }

}

问题描述:
给定n个向量的起点和终点x1,y1,x2,y2,再给出一个目标向量,求能否由n个向量中的两个相加构造出一个与目标向量平行的向量(注意,平行包括方向相同或相反)
第一行给定一个整数n
接下来n行每行四个整数x1,y1,x2,y2,表示第i个向量的起点和终点
最后一行给出四个整数x1,y1,x2,y2,表示目标向量的起点和终点
若可以,输出“YES”
否则输出“NO”(均不含引号)
第一行给定一个整数n
接下来n行每行四个整数xl, y1,x2,y2,表示第i个向量的起点和终点最后一行给出四个整数x1,y1, x2,y2,表示目标向量的起点和终点1n<1000,1 <c1, gl,c2, g2 <10000
愉出描述:
若可以,输出”YEs"
否则输出"NO”(均不含引号)
示例1输入输出示例仅供词试,后台判题数据一股不包含示例
输入

5
1 2 4 8
2 4 5 10
1 2 2 4
3 5 4 6 
6 10 7 11
1 1 4 7 
 

输出

YES 

代码--该代码仅为参考

import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        int n, c=0, k=0, m=1;
        double p,q,x,y;
        Scanner scan = new Scanner(System.in);
        
        if  ((n=scan.nextInt())!=0) {
            int[][] a = new int[n+1][6];
            for(int i=0; i<=n; i++) {
                for(int j=0; j<4; j++) {
                    a[i][j] = scan.nextInt();  //存储输入各个向量的始末坐标
                
                }
           
                a[i][4] = a[i][2] - a[i][0]; //用每一行的两个元素表示 该向量的坐标
                a[i][5] = a[i][3] - a[i][1]; 
            }

            for(m=0; m<n; m++) {
                for(k=m+1; k<n; k++) {
                    x = a[m][4] + a[k][4];  //将两个平行的向量坐标 相加存入X 和 Y中
                    y = a[m][5] + a[k][5];  
                    p = a[n][4] * y; 
                    q = a[n][5] * x;
                    if (p == q) { // 判断向量与目标向量是否平行
                        c++;
                    }
                }
            }

            if (c!=0) {
                System.out.println("YES");
            } else {
                System.out.println("NO");
            }
        }
    }

}

题目描述:
国王将金币作为工资,发放给忠诚的骑士。第一天,骑士收到一枚金币;之后两天(第二天和第三天),每天收到两枚金币;之后三天(第四、五、六天),每天收到三枚金币;之后四天(第七、八、九、十天),每天收到四枚金币……;这种工资发放模式会一直这样延续下去:当连续N天每天收到N枚金币后,骑士会在之后的连续N+1天里,每天收到N+1枚金币。
请计算在前K天里,骑士一共获得了多少金币。
代码:

import java.util.Scanner;

public class Main{

    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        int k=sc.nextInt();
        int count=0,s=1,flag=1,i;
        for(i=1;i<=k;s++,flag++) {
            for(int j=1;j<=flag;j++) {
                count+=s;
                i++;
                if(i>k) {
                    break;
                }
            }
        }
        System.out.println(count);
    }

}

题目描述:

试计算在区间1 到n 的所有整数中,数字x(0 ≤ x ≤ 9)共出现了多少次?
例如,在1到11 中,即在1、2、3、4、5、6、7、8、9、10、11 中,数字1 出现了4 次。

import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt();
        int x=sc.nextInt();
        StringBuilder str=new StringBuilder();
        long count=0;
        for(int i=1;i<=n;i++) {
            str.append(i);
        }
        String str2=str.toString();
        char []c=str2.toCharArray();
        for(int i=0;i<c.length;i++) {
            if(c[i]==((char)('0'+x))) {
                count++;
            }
        }
        System.out.println(count);

    }

}

给你一个数,让他进行巴啦啦能量,沙鲁沙鲁,小魔仙大变身,如果进行变身的数不满足条件的话,就继续让他变身。。。直到满足条件为止。
巴啦啦能量,沙鲁沙鲁,小魔仙大变身:对于一个数,把他所有位上的数字进行加和,得到新的数。
如果这个数字是个位数的话,那么他就满足条件。

代码:

import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt();
        wer(n);
    }
    static void wer(int n) {
        String str=String.valueOf(n);
        char c[]=str.toCharArray();
        int g=0;
        for(int i=0;i<c.length;i++) {
            g+=c[i]-'0';
        }
        if(g<10) {
            System.out.println(g);
        }else {
            wer(g);
        }
    }

}

题目描述:

栗酱一个人闲得无聊的时候总是会一个人玩一些有趣的游戏。
有一天,她在机房里看见了一张图,可能是做acm的学长留下的:
在这里插入图片描述
栗酱想知道每一个数字,横着竖着分别有几根火柴呢?(由于火柴商偷工减料,我们认定,只要存在棍子,它就是火柴!)

代码:

import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        int t=sc.nextInt();
        for(int i=0;i<t;i++) {
            int a=sc.nextInt();
            int h=0,s=0;
            int num=0;
            if(a==0) {
                h=2;
                s=4;
            }
            else {
                while(a!=0) {
                    num=a%10;
                    a=a/10;
                    switch (num){
                        case 0:h+=2;s+=4;break;
                        case 1:h+=0;s+=2;break;
                        case 2:h+=3;s+=2;break;
                        case 3:h+=3;s+=2;break;
                        case 4:h+=1;s+=3;break;
                        case 5:h+=3;s+=2;break;
                        case 6:h+=3;s+=3;break;
                        case 7:h+=1;s+=2;break;
                        case 8:h+=3;s+=4;break;
                        case 9:h+=3;s+=3;break;
                    }
                }
            }
            System.out.println(h+" "+s);    
            
        }
        
    }
    

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值