前言
本分的题解都是博主在经过跟伙伴一定的讨论,初步认为无误的,博主是JavaB国二。所以也是菜鸡一个,大家互相学习罢了。如果有错误或者感觉有疑问。欢迎评论区"开战"。
题目文件
题目文件我用百度网盘分享给大家 连接链接:https://pan.baidu.com/s/1pZk9GZ7Mc-zxmv7z373W7w
提取码:ovj8
目录
试题A:美丽的2
试题D:本质上的升序列
美丽的2
问题描述
小蓝特别喜欢 2,今年是公元 2020 年,他特别高兴。
他很好奇,在公元 1 年到公元 2020 年(包含)中,有多少个年份的数位中
包含数字 2?(填空题)
分析
暴力循环1~2020。int转换为string判断每个string是否存在2,做计数即可。这道题就是一个送分题,很简单。
public class Main {
public static void main(String[] args) {
int count = 0;
for (int i = 1; i <=2020 ; i++) {
String s = String.valueOf(i);
for (int j = 0; j < s.length(); j++) {
if (s.charAt(j) == '2') {
count++;
break;
}
}
}
System.out.println(count);
}
}
本质上升序列
题目描述
小蓝特别喜欢单调递增的事物。
在一个字符串中,如果取出若干个字符,将这些字符按照在字符串中的顺
序排列后是单调递增的,则成为这个字符串中的一个单调递增子序列。
例如,在字符串 lanqiao 中,如果取出字符 n 和 q,则 nq 组成一个单
调递增子序列。类似的单调递增子序列还有 lnq、 i、 ano 等等。
小蓝发现,有些子序列虽然位置不同,但是字符序列是一样的,例如取第
二个字符和最后一个字符可以取到 ao,取最后两个字符也可以取到 ao。小蓝
认为他们并没有本质不同。
对于一个字符串,小蓝想知道,本质不同的递增子序列有多少个?
例如,对于字符串 lanqiao,本质不同的递增子序列有 21 个。它们分别
是 l、 a、 n、 q、 i、 o、 ln、 an、 lq、 aq、 nq、 ai、 lo、 ao、 no、 io、 lnq、
anq、 lno、 ano、 aio。
请问对于以下字符串(共 200 个小写英文字母,分四行显示):(如果你把
以下文字复制到文本文件中,请务必检查复制的内容是否与文档中的一致。在
试题目录下有一个文件 inc.txt,内容与下面的文本相同)
tocyjkdzcieoiodfpbgcncsrjbhmugdnojjddhllnofawllbhf
iadgdcdjstemphmnjihecoapdjjrprrqnhgccevdarufmliqij
gihhfgdcmxvicfauachlifhafpdccfseflcdgjncadfclvfmad
vrnaaahahndsikzssoywakgnfjjaihtniptwoulxbaeqkqhfwl
本质不同的递增子序列有多少个?
分析
这道题正合我的胃口,最近正在刷动态循环(laduladong的算法小抄)动态规划最重要的就是先确定dp数组的定义,构建base case(动态规划初始的部分),最后状态转移返程。
dp[i]表示以num[i](num为String转换成char的数组)结尾的上升序列数量。
状态转移方程得排dp[i]=dp[0…i](中结尾比num[i]小的dp),如果相等的话,需要相减去重。
最后需要的结果就是全部dp的和。上代码
public class Main {
public static int[] dp;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String s = sc.next();
char[] num = s.toCharArray();
dp = new int[s.length()];
//num[i]本身是一个升序列,初始化1
Arrays.fill(dp, 1);
for (int i = 0; i < s.length(); i++) {
for (int j = 0; j < i; j++) {
if (num[j] < num[i]) {
dp[i] += dp[j];
}
if (num[j] == num[i]) {
dp[i] -= dp[j];
}
}
}
int res=0;
for (int i = 0; i < dp.length; i++) {
res+=dp[i];
}
System.out.println(res);
}
}