牛客网算法题(一)

本文介绍了四道编程题目,涉及动态规划、字符串处理、递归和字符串替换等算法。第一题是关于骑士获得金币的计算问题,第二题计算数字在一定范围内的出现次数,第三题实现数字变形直到变成一位数,第四题则涉及字符串的字符替换。这些题目旨在锻炼程序员的逻辑思维和编程能力。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

第一题

1012题目链接

题目描述:

国王将金币作为工资,发放给忠诚的骑士。第一天,骑士收到一枚金币;之后两天(第二天和第三天),每天收到两枚金币;之后三天(第四、五、六天),每天收到三枚金币;之后四天(第七、八、九、十天),每天收到四枚金币……;这种工资发放模式会一直这样延续下去:当连续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);
	}

}

第二题

1017题目链接

题目描述:

试计算在区间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);

	}

}

注意:

  1. 字符串拼接的时候不要用String。
  2. 因为String在拼接字符串的时候一直在创建对象,大量的副本对象积累在堆内存里。
  3. 用String拼接字符串降低了效率,放在循环里会影响程序的性能,导致时间复杂度增高,导致超时。
  4. 在写算法题的时候尽量使用StringBuilder,如果在应用程序要求线程安全的情况下,则使用 StringBuffer 类。
  5. StringBuilder比StringBuffer的效率高,但是StringBuffer比StringBuilder的线程安全。

第三题

1021题目链接

题目描述:

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

代码:

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);
		}
	}

}

第四题

1024题目链接

题目描述:

给定长度为n的只有小写字母的字符串s,进行m次操作,每次将[l,r]范围内所有c1字符改成c2,输出操作完的字符串

代码:

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);
		
	}

}

第五题

1027题目链接

题目详情

栗酱一个人闲得无聊的时候总是会一个人玩一些有趣的游戏。
有一天,她在机房里看见了一张图,可能是做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、付费专栏及课程。

余额充值