public class Main {
public static void main(String[] args) {
int sum=0;
for (int i = 1; i <=2020 ; i++) {
int j=i;
while (j!=0)
{
int t=j%10;
if(t==2)
{
sum++;
}
j/=10;
}
}
System.out.println(sum);
}
}
答案:624
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
int sum=0;
char n[][]= new char[300][300];
for (int i = 0; i <300 ; i++) {
n[i]=new Scanner(System.in).nextLine().toCharArray();
}
for (int i = 0; i < 300; i++) {
for (int j = 0; j <300 ; j++) {
if(n[i][j]=='2')
{
if(i+3<300)
{
if(n[i+1][j]=='0'&&n[i+2][j]=='2'&&n[i+3][j]=='0')
{
sum++;
}
}
if(j+3<300)
{
if(n[i][j+1]=='0'&&n[i][j+2]=='2'&&n[i][j+3]=='0')
{
sum++;
}
}
if(j+3<300&&i+3<300)
{
if(n[i+1][j+1]=='0'&&n[i+2][j+2]=='2'&&n[i+3][j+3]=='0')
{
sum++;
}
}
}
}
}
System.out.println(sum);
}
}
答案:16520
看第1列,1为第1组 3,4为第2组 10,11为第3组,那么可以得出公式:
第n组第一个数=1+2(n-1)+5(n-2)+(n-2)*(n-3)*2
根据规律:
第1行第1列是1,第2行第2列是第2组第1个数+2,第3行第3列是第3组第1个数+3
所以第20行20列为第20组第1个数+20
答案:761
//有点问题,最后得到的是92,还要排除几种情况。。所以我这种方法比较麻烦
import java.util.ArrayList;
public class Main {
static ArrayList<String> arr= new ArrayList<>();
static char[] a = {'a','b','c','d','e','f','g'};
public static void main(String[] args) {
int sum=0;
dfs(1,"",0);
dfs(0,"",0);
for (String s:arr)
{
if(check(s))
{
sum++;
System.out.println(s);
}
}
System.out.println(sum);
}
public static void dfs(int flag,String str,int index)
{
if(index==7)
{
return;
}
if(flag==0)
{
dfs(1,str,index+1);
dfs(0,str,index+1);
}
else
{
arr.add(str+a[index]);
dfs(1,str+a[index],index+1);
dfs(0,str+a[index],index+1);
}
return;
}
public static boolean check(String s)
{
char a[] = s.toCharArray();
if(a.length==1)
{
return true;
}
for (int i = 0; i <a.length-1 ; i++) {
if(a[i]=='a'&&a[i+1]!='b'&&a[i+1]!='f')
{
return false;
}
if(a[i]=='b'&&a[i+1]!='c'&&a[i+1]!='g')
{
if(i>0&&a[i-1]!='a')
{
return false;
}
}
if(a[i]=='c'&&a[i+1]!='g'&&a[i+1]!='d')
{
if(i>0&&a[i-1]!='b')
{
return false;
}
}
if(a[i]=='d'&&a[i+1]!='e')
{
if(i>0&&a[i-1]!='c')
{
return false;
}
}
if(a[i]=='e'&&a[i+1]!='f'&&a[i+1]>'g')
{
if(i!=0&&a[i-1]!='d')
{
return false;
}
}
if(a[i]=='f'&&a[i+1]!='a'&&a[i+1]!='g'&&a[i-1]!='e')
{
if(i>0&&a[i-1]!='e')
{
return false;
}
}
}
return true;
}
}
答案:80
//这道题慢慢试
public class Main {
public static void main(String[] args) {
int sum=0;
String s ="abcdefghijklmn"; //91次
String s ="abcdefghijklmno";//105次
String s ="abcdefghijklmon";//104次
String s ="abcdefghiklmnoj";//100次
s=new StringBuilder(s).reverse().toString();//加了一个翻转,方便自己去慢慢试
char[] ch = s.toCharArray();
for (int i = 0; i <ch.length-1 ; i++) {
for (int j = 0; j <ch.length-1; j++) {
if(ch[j]>ch[j+1])
{
sum++;
char t=ch[j+1];
ch[j+1]=ch[j];
ch[j]=t;
}
}
}
System.out.println(sum);
}
}
答案: jonmlkihgfedcba
样例输入:
7
80
92
56
74
88
99
10
样例输出:
99
10
71.29
这道题不难,属于送分题
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n=sc.nextInt();
int a[]=new int[n];
int max=0,min=999;
double avg=0;
for (int i = 0; i <n ; i++) {
a[i]=sc.nextInt();
}
for (int i = 0; i <n; i++) {
if(a[i]>max)
{
max=a[i];
}
if(a[i]<min)
{
min=a[i];
}
avg+=a[i];
}
System.out.println(max);
System.out.println(min);
System.out.printf("%.2f",avg/n);
}
}
样例输入1:
lanqiao
样例输出:
a
2
样例输入2:
longlonglongistoolong
样例输出:
o
6
这道题也挺简单的,出现相同次数的时候我的方法是加入到集合中
import java.util.ArrayList;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
int max=0;
int a[] = new int[26];
Scanner sc = new Scanner(System.in);
String s =sc.next();
ArrayList<Integer> arr = new ArrayList<>();
char[] b = s.toCharArray();
for (int i = 0; i <b.length; i++) {
a[b[i]-'a']++;
}
for (int i = 0; i <a.length; i++) {
if(max<a[i])
{
max=a[i];
}
}
for (int i = 0; i <a.length; i++) {
if(a[i]==max)
{
arr.add(i);
}
}
//若有出现相同的次数,找字典序最小的,即数字最小的
int min=99;
for (int i:arr)
{
if(min>i)
{
min=i;
}
}
System.out.println((char) (min+'a'));
System.out.println(max);
}
}
样例输入:
5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
样例输出:
27
//这道题用dfs,再用两个参数记录走left与right的次数,小心数组越界
import java.util.Scanner;
public class Main {
static Scanner sc =new Scanner(System.in);
static int sum=0;
static int a[][];
static int vis[][];
static int n=sc.nextInt();//n行
public static void main(String[] args) {
a = new int[n][n];
vis=new int[n][n];
for (int i = 0; i <n; i++) {
for (int j = 0; j <=i ; j++) {
a[i][j]=sc.nextInt();
}
}
vis[0][0]=1;
dfs(0,0,0,0,0);
System.out.println(sum);
}
public static void dfs(int step,int left,int right,int x,int y)
{
step+=a[x][y];
if(x==n-1)
{
if(left-right>1||right-left>1)
{
return;
}
if(sum<step)
{
sum=step;
}
return;
}
if(vis[x+1][y]==0)
{
vis[x+1][y]=1;
dfs(step,left+1,right,x+1,y);
vis[x+1][y]=0;
}
if(vis[x+1][y+1]==0)
{
vis[x+1][y+1]=1;
dfs(step,left,right+1,x+1,y+1);
vis[x+1][y+1]=0;
}
return;
}
}
样例输入:
ababc
样例输出:
28
样例说明:
子串 f值
a 1
ab 2
aba 2
abab 2
ababc 3
b 1
ba 2
bab 2
babc 3
a 1
ab 2
abc 3
b 1
bc 2
c 1
//这道题用哈希表来写会很简单,先把字符串的子串截取出来添加到ArrayList集合,再判断即可
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
int sum=0;
String str =new Scanner(System.in).next();
ArrayList<String> arr = new ArrayList<>();
for (int i = 0; i <str.length(); i++) {
for (int j = i+1; j <=str.length(); j++) {
arr.add(str.substring(i,j));
}
}
for (String i :arr)
{
sum+=pd(i);
}
System.out.println(sum);
}
public static int pd(String s)
{
HashSet<Character> set = new HashSet<>();
char a[]=s.toCharArray();
for (int i = 0; i <s.length(); i++) {
set.add(a[i]);
}
return set.size();
}
}
还有一道暂时放弃。