今天看了2020年校内模拟赛的讲解视频(前半部分),把自己觉得比较好的记录一下,其实最终还是理解官方的讲解博客。
4.25日
4.题目:
在1至2019(注意起始)中,有多少个数的数位中包含数字9?
注意,有的数中的数位中包含多个9,这个数只算一次。例如,1999这个数包含数字9,在计算时只是算一个数。
结果为1个整数
解:
自己当时的代码:
public class T3 {
public static void main(String[] args) {
int count = 0;
for (int i = 1; i <=2019; i++) {
if (i % 10 == 9) {
count++;
System.out.println(i);
continue;
}else if ((i/10)%10==9) {
count++;
System.out.println(i);
continue;
}else if ((i/100)%10==9) {
count++;
System.out.println(i);
continue;
} else if ((i/1000)%10==9) {
count++;
System.out.println(i);
continue;
}
}
System.out.println(count);
}
}
答案方法:
1、连接成字符串,结合了string.indexOf方法判断数组中是否含有9,其思路主要是利用index0f如果找到了就返回9对应的下标,如果没有找到就返回-1
2、自己又想到的连接成字符串用contains方法判断是否含有9
public class AT3 {
static final int N = 2019;
//构造一个静态check函数,判断是否含有9
static boolean check(int i) {
String str = i+"";//这一步先把数字换成字符串
//return str.contains("9");//方法一:用contains方法
return str.indexOf('9')!=-1;//方法二:返回true=>!=-1,就说明数字中包含9;
}
public static void main(String[] args) {
int count=0;
for (int i = 1; i <=2019 ; i++) {
if (check(i)) {
count++;
}
}
System.out.println(count);
}
}
5.题目:
一个正整数如果任何一个数位不大于右边相邻的数位,则称为一个数位递增的数,例如1135是一个数位递增的数,而1024不是一个数位递增的数。
给定正整数 n,请问在整数 1 至 n 中有多少个数位递增的数?
对于所有评测用例,1 <= n <= 1000000。
【输入格式】
输入的第一行包含一个整数 n。
【输出格式】
输出一行包含一个整数,表示答案。
【样例输入】
30
【样例输出】
26
【评测用例规模与约定】
对于 40% 的评测用例,1 <= n <= 1000。
对于 80% 的评测用例,1 <= n <= 100000。
对于所有评测用例,1 <= n <= 1000000。//判断出可以暴力解决
解:
自己当时的代码:
public class DT2 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner scanner = new Scanner(System.in);
long n = scanner.nextLong();
long count = 0;
for (int i = 1; i <= n; i++) {
if (test(i)==true) {
/* System.out.println(i); */
count++;
}
}
System.out.println(count);
}
public static boolean test(long n) {
boolean isok = true;
if ((n%10<(n/10)%10)) {
return false;
}else {
if (n>=10) {
isok = test(n/10);
}else {
return true;
}
}
return isok;
}
}
答案代码:依旧是数字字符串化
public class AT2 {
static Scanner sc = new Scanner(System.in);
public static void main(String[] args) {
// TODO Auto-generated method stub
work();
}
private static void work() {
// TODO Auto-generated method stub
int n = sc.nextInt();
int ans = 0;
for (int i = 1; i <= n ; i++) {
String s = "" +i;//把整数字符串化
boolean flag=true;
for (int j = 1; j < s.length(); j++) {
if (s.charAt(j-1)>s.charAt(j)) {
flag = false;
break;
}
}
if (flag) {
ans++;
}
}
System.out.println(ans);
}
}
6.题目:
在数列 a[1], a[2], …, a[n] 中,如果对于下标 i, j, k 满足 0
给定一个数列,请问数列中有多少个元素可能是递增三元组的中心。
【输入格式】
输入的第一行包含一个整数 n。
第二行包含 n 个整数 a[1], a[2], …, a[n],相邻的整数间用空格分隔,表示给定的数列。
【输出格式】
输出一行包含一个整数,表示答案。
【样例输入】
5
1 2 5 3 5
【样例输出】
2
【样例说明】
a[2] 和 a[4] 可能是三元组的中心。
【评测用例规模与约定】
对于 50% 的评测用例,2 <= n <= 100,0 <= 数列中的数 <= 1000。
对于所有评测用例,2 <= n <= 1000,0 <= 数列中的数 <= 10000。
解:
自己当时的代码:
public class DT1 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n =scanner.nextInt();
int[] a = new int[n+1];
int count = 0;
for (int i = 1; i < a.length; i++) {
a[i] = scanner.nextInt();
}
int res[] = new int[a.length];
int i=1,j=1,k=1;
for ( i = 1; i < a.length; i++) {
for ( j = i+1; j < a.length; j++) {
for ( k = j+1; k < a.length; k++) {
if (a[i]
枚举每个元素
该元素与前面的元素比较,找到小的即可
该元素与后面的元素比较,找到大的即可
上面两项为真,即说明当前元素可以作为三元组的中心
public class AT4 {
static Scanner sc = new Scanner(System.in);
public static void main(String[] args) {
// TODO Auto-generated method stub
work();
}
private static void work() {
// TODO Auto-generated method stub
int n,ans = 0;
n = sc.nextInt();
int[] data = new int[n];
for (int i = 0; i < n; i++) {
data[i]=sc.nextInt();
}
for (int j = 1; j < n - 1 ; j++) {
//int hassmall = 0;//可以改成bool
boolean hassmall = false;
for (int i = 0; i < j; i++) {
if (data[i]
录播课互动答题:
录播课互动答题:
答案:n
7.题目 原因判断:
【问题描述】
小明对类似于 hello 这种单词非常感兴趣,这种单词可以正好分为四段,第一段由一个或多个辅音字母组成,第二段由一个或多个元音字母组成,第三段由一个或多个辅音字母组成,第四段由一个或多个元音字母组成。
给定一个单词,请判断这个单词是否也是这种单词,如果是请输出yes,否则请输出no。
元音字母包括 a, e, i, o, u,共五个,其他均为辅音字母。
【输入格式】
输入一行,包含一个单词,单词中只包含小写英文字母。
【输出格式】
输出答案,或者为yes,或者为no。
【样例输入】
lanqiao
【样例输出】
yes
【样例输入】
world
【样例输出】
no
【评测用例规模与约定】
对于所有评测用例,单词中的字母个数不超过100。
解:比赛时自己的代码如下
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner scanner = new Scanner(System.in);
String word = scanner.next();
char[] arr = word.toCharArray();
boolean[] bol = new boolean[word.length()];
for (int i = 0; i < arr.length; i++) {
bol[i] =word.charAt(i)=='a'||word.charAt(i)=='e'||word.charAt(i)=='i'||word.charAt(i)=='o'||word.charAt(i)=='u';
}
boolean[] res = new boolean[word.length()];
boolean flag = bol[0];
int num=0;
res[num] = bol[0];
for (int i = 0; i < bol.length; i++) {
if (bol[i]==flag) {
continue;
}else {
num++;
res[num]=bol[i];
flag = bol[i];
}
}
if (num==3 && res[0]==false) {
System.out.println("yes");
}else {
System.out.println("no");
}
}
}
反思:自己的代码主要和答案中的思路二,比较像,先解决思路2
思路二:
将单词的辅音标记为0,元音标记为1,那么符合要求的单词形态为0+ 1+ 0+ 1
在限定开头必须为0,最后必须为1的情况下,01交替为3次,即前后元素相加结果为1的次数必须为3
public class AT5_2 {
static Scanner sc = new Scanner(System.in);
public static void main(String[] args) {
// TODO Auto-generated method stub
/* long time=System.currentTimeMillis(); */
if (work()) {
System.out.println("yes");
}else {
System.out.println("no");
}
/*
* long times=System.currentTimeMillis(); System.out.println(times-time);
*/
}
static boolean isYuan(char c) {
return c=='a'||c=='e'||c=='i'||c=='o'||c=='u';
}
private static boolean work() {
String word = sc.nextLine();//或者next()
int size = word.length();
if (size<4) {
return false;
}
if (isYuan(word.charAt(0))||!isYuan(word.charAt(size-1))) {//判断,如果第一个和最后一个分别是元音和辅音的话,也可以直接不符合要求,直接返回
return false;
}
//引入辅助数组h
int[] h = new int[size];
for (int i = 0; i < h.length; i++) {
if (isYuan(word.charAt(i))) {
h[i]=1;
}else {
h[i]=0;
}
}
int cnt = 0;
for (int i = 1; i < h.length; i++) {//在限定开头必须为0,最后必须为1的情况下,01交替为3次,即前后元素相加结果为1的次数必须为3
if (h[i-1]+h[i]==1) {
cnt++;
}
}
return cnt==3;
}
}
思路一:正则表达式 java中支持正则表达式
+表示出现一次到若干次
^表示否定,[^aeiou]即非aeiou中的若干次
public class _07 {
static Pattern p = Pattern.compile("[^aeiou]+[aeiou]+[^aeiou]+[aeiou]+");//编译Pattern
static Scanner sc = new Scanner(System.in);
public static void main(String[] args) {
while (true) { //死循环是为了测试
if (work())
System.out.println("yes");
else
System.out.println("no");
}
}
static boolean work() {
String word = sc.nextLine();
Matcher m = p.matcher(word);
return m.matches();
}
}
今天暂时整理到这里,希望自己能够主动学习Java的正则表达式并出一片博客,后三道大题近期整理吧