#A:门牌制作 624

解一:
public static void main(String[] args) {
   int count=0;
    for(int i=1;i<=2020;i++) {
    int n=i;
   while(n>0) {
     if(n%10==2) {
      count++;
    }
    n/=10;
 }
}
System.out.println(count);
} 
解二:
public static void main(String[] args) {
        int cnt=0;
        for (int i = 1; i <= 2020; i++) {
            String s=i+"";
            for (int j = 0; j < s.length(); j++) {
                if(s.charAt(j)=='2') cnt++;
            }
        }
        System.out.println(cnt);
    } 
#寻找 2020 16520

public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
char[][] ch = new char[300][300];
long sum = 0 ;
for (int i = 0; i < ch.length; i++) {
ch[i] = scanner.nextLine().toCharArray();
}
for (int i = 0; i < ch.length; i++) {
for (int j = 0; j < ch[0].length; j++) {
if (j+3<ch[0].length) {
if (ch[i][j]=='2' && ch[i][j+1]=='0' &&ch[i][j+2]=='2' &&ch[i][j+3]=='0' ) {
sum++;
}
}
if (i+3<ch.length) {
if (ch[i][j]=='2' && ch[i+1][j]=='0' &&ch[i+2][j]=='2' &&ch[i+3][j]=='0') {
sum++;
}
}
if (i+3<ch.length && j+3<ch[0].length) {
if (ch[i][j]=='2' && ch[i+1][j+1]=='0' &&ch[i+2][j+2]=='2' &&ch[i+3][j+3]=='0') {
sum++;
}
}
}
}
System.out.println(sum);//16520
} 
 
#C: 蛇形填数 761

解题思路:先手写几行就可以发现,第一行第一列的值为1,第二行第二列的值为5.第三行第三列的值为13,第四行第四列的值为25,仔细观察就可以发现第i行第i列的值为 a = a + (i*4)。
public static void main(String[] args) {
// TODO Auto-generated method stub
int sum = 1;
for (int i = 0; i < 20; i++) {
sum = sum + (i * 4);
}System.out.println(sum);
} 
#D:七段码(dfs) 80

   解一:
static int[][] list = new int[][]{
            {0,1,0,0,0,1,0},
            {1,0,1,0,0,0,1},
            {0,1,0,1,0,0,1},
            {0,0,1,0,1,0,0},
            {0,0,0,1,0,1,1},
            {1,0,0,0,1,0,1},
            {0,1,1,0,1,1,0},
    };
    static Set<Set<Integer>> set = new HashSet<>();
    static boolean[] booleans = new boolean[7];
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        ArrayList<Integer> arr = new ArrayList<>();
        for (int i = 0 ; i < 7 ; i++){
            booleans[i] = true;
            arr.add(i);
            set.add(new HashSet<>(arr));
            dfs(arr);
            booleans[i] = false;
            arr.remove(arr.size()-1);
        }
        System.out.println(set.size());
    }
    private static void dfs(ArrayList<Integer> arr) {
        set.add(new HashSet<>(arr));
        int last = arr.get(arr.size()-1);
        for (int i = 0 ; i < list[last].length ; i++){
            if (list[last][i] == 1 && !booleans[i]){
                booleans[i] = true;
                arr.add(i);
                dfs(arr);
                booleans[i] = false;
                arr.remove(arr.size()-1);
            }
        }
    } 
解二:
public static void main(String[] args) {
creatGraph();
dfs(1);
System.out.println(count);
}
private static void creatGraph() {
arr[1][2] = arr[1][6] = 1;
arr[2][1] = arr[2][7] = arr[2][3] = 1;
arr[3][2] = arr[3][4] = arr[3][7] = 1;
arr[4][3] = arr[4][5] = 1;
arr[5][4] = arr[5][6] = arr[5][7] = 1;
arr[6][1] = arr[6][5] = arr[6][7] = 1;
}
private static void dfs(int k) {
if (k > 7) {
check();
int q = 0;
for (int i = 1; i <= 7; i++) {
if (v[i] && res[i] == i) {
q++;
}
}
if (q == 1)
count++;
return;
}
v[k] = true;
dfs(k + 1);
v[k] = false;
dfs(k + 1);
}
private static void check() {
for (int i = 1; i <= 7; i++) {
res[i] = i;
}
for (int i = 1; i <= 7; i++) {
for (int j = 1; j <= 7; j++) {
if (arr[i][j] != 0 && v[i] && v[j]) {
int fx = find(i), fy = find(j);
if (fx != fy) {
res[fx] = fy;
}
}
}
}
}
private static int find(int p) {
if (res[p] == p) {
return p;
} else {
res[p] = find(res[p]);
return res[p];
}
} 
 
#E:排序 jonmlkihgfedcba

--------------------------------------------------------------------
--------------------------------------------------------------------
#F:成绩分析(模拟、暴力)

public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
  int n=sc.nextInt();
  int a,max=0,min=100;
  double sum=0;
  for(int i=0;i<n;i++) {
  a=sc.nextInt();
  if(max<a) {
  max=a;
  }
  if(min>a) {
  min=a;
  }
  sum+=a;
  }
  System.out.println(max);
  System.out.println(min);
  System.out.printf("%.2f",sum/n);
} 
 
#G:单词分析(字符串)

 
public static void main(String[] args) {
 
Scanner sc=new Scanner(System.in);
String str=sc.next();
int[]arr =new int[26];
int a=0;;char ch = 'a';
for(int i=0;i<str.length();i++) {
    arr[str.charAt(i)-97]++;
    if(arr[str.charAt(i)-97]>a) {
     a=arr[str.charAt(i)-97];
     ch=str.charAt(i);
    }else if(arr[str.charAt(i)-97]==a) {
     if(ch-str.charAt(i)>0) {
     a=arr[str.charAt(i)-97];
         ch=str.charAt(i);
     }
    }
}
System.out.println(ch); System.out.println(a);
} 
#H: 数字三角形(DP)


    
 public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n=scanner.nextInt();
        int [][]arr=new int[n+1][n+1];
        for (int i = 1; i < arr.length; i++) {
            for (int j = 1; j <= i; j++) {
                int s=scanner.nextInt();
                arr[i][j]=s+Math.max(arr[i-1][j-1],arr[i-1][j]);
            }
        }
        System.out.println(n%2==1?arr[n][n/2+1]:Math.max(arr[n][n/2],arr[n][n/2+1]));
    }
} 
解二:
  public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        //base case : f(1) = a1
        int[][] dp = new int[n][n+1];
        int temp = scanner.nextInt();
        dp[0][0] = temp;
        int max = Integer.MIN_VALUE;
        for (int i = 2; i <= n; i++) {
            for (int j = 0; j < i; j++) {
                temp = scanner.nextInt();
                if (j != 0 && j != (i-1)) {
                    dp[i-1][j] = Integer.max(dp[i-2][j-1],dp[i-1][j])+temp;
                }else if (j == 0) {
                    dp[i-1][j] = dp[i-2][j]+temp;
                }else {
                    dp[i-1][j] = dp[i-2][j-1]+temp;
                }
                if(dp[i-1][j] > max)
                    max = dp[i-1][j];
            }
            dp[i-1][n] = max;
            max = Integer.MIN_VALUE;
        }
        System.out.println(dp[n-1][n]);
        scanner.close();
} 
# I:子串分值和(规律题吧)
 

解一:
 public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int[] arr = new int[26];
        long res = 0;
        for(int i = 0;i < 26;i++){
            arr[i] = -1;
        }
        String s = sc.nextLine();
        String[] str = s.split("");
        int willIndex = str.length;
        for(int i = 0;i < str.length;i++){
            int lastIndex = arr[str[i].charAt(0)-97];
            res += (long)(i - lastIndex)*(willIndex - i);
            arr[str[i].charAt(0)-97] = i;
        }
        System.out.println(res);
    } 
解二:
public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String str = sc.next();
        int[] nums = new int[26];
        long res = 0;
        long n = str.length();
        str = "0"+str;
        for (int i = 1; i < str.length(); i++) {
           
            res += (i - nums[str.charAt(i) - 'a']) * (n - i+1);
         
            nums[str.charAt(i) - 'a'] = i;
        }
        System.out.println(res);
    } 
#J: 装饰珠

 












