这题很简单,找出分子的规律就行。
import java.util.Scanner;
// 1:无需package
// 2: 类名必须Main, 不可修改
public class Main {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int fenzi=1;
int fenmu=1;
for(int i=1;i<20;i++){
fenmu*=2;
fenzi+=fenmu;
}
System.out.println(fenzi+"/"+fenmu);
scan.close();
}
}
这道题主要想不到怎么根据年份来确定具体的日期。看了题解才懂,按自己写的直接对日期进行循环,通过率只有80(剩下的20因为复杂度太高而通过不了),对year进行循环时间复杂度会降低,达到100通过率。
import java.util.Scanner;
//1:无需package
//2: 类名必须Main, 不可修改
//要构造两个方法,一个是否为回文日期,另一个是否为ABABBABA类型的回文日期,个人感觉第二个方法基于第一个方法,
//判断是回文数之后,再根据条件判断其符合ABABBABA型的回文数,需要注意的是月日的限制条件。
public class Main {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
//在此输入您的代码...
int n=scan.nextInt();
String ss=n+"";
int year=Integer.parseInt(ss.substring(0,4));
int month=Integer.parseInt(ss.substring(4,6));
int date=Integer.parseInt(ss.substring(6,8));
for(int i=year;;i++){
int t=i;
int m=i;
while(t>0){
m=m*10+t%10;
t/=10;
}
if(huiwen(m)){
System.out.println(m);
break;
}
}
for(int i=year;;i++){
int t=i;
int m=i;
while(t>0){
m=m*10+t%10;
t/=10;
}
if(ABA(m)){
System.out.println(m);
break;
}
}
scan.close();
}
public static boolean huiwen(int j){
String arr=j+"";
int year=Integer.parseInt(arr.substring(0,4));
int month=Integer.parseInt(arr.substring(4,6));
int date=Integer.parseInt(arr.substring(6,8));
char [] c=arr.toCharArray();
for(int i=0;i<c.length/2;i++){
if(c[i]!=c[c.length-i-1]){
return false;
}
}
if(month==2&&date>29&&runyear(year)){
return false;
}
if(month==2&&date>28&&pingyear(year)){
return false;
}
if(date==0||month==0||month>12){
return false;
}//判断日期为0,月份为0,月份>12的情况
if(month==1&&date>31||month==3&&date>31||month==5&&date>31||month==7&&date>31||month==8&&date>31||month==10&&date>31||month==12&&date>31){
return false;
}//判断有31天的月份
if(month==4&&date>30||month==6&&date>30||month==9&&date>30||month==11&&date>30){
return false;
}//判断有30天的月份
return true;
}
public static boolean ABA(int k){
if(huiwen(k)){
String brr=k+"";
char [] d=brr.toCharArray();
if(d[0]==d[2]&&d[2]==d[5]&&d[5]==d[7]&&d[1]==d[3]&&d[3]==d[4]&&d[4]==d[6]){
return true;
}
}
return false;
}
public static boolean runyear(int n){
if(n%4==0&&n%100!=0){
return true;
}
return false;
}
public static boolean pingyear(int n){
if(n%4!=0){
return true;
}
return false;
}
}
import java.util.*;
import java.io.*;
public class Main {
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
static StreamTokenizer st = new StreamTokenizer(br);
static PrintWriter pw = new PrintWriter(new OutputStreamWriter(System.out));
static int n, m;
static int[][]arr = new int[2010][2010];
static Map<String, List<int[]>> map = new HashMap<>();
static double ans = 0;
public static void main(String[] args) throws Exception {
n = nextInt();
m = nextInt();
for (int i = 0; i < m; i++) {
String[] kk = br.readLine().split(" ");
int x1 = Integer.parseInt(kk[0]), y1 = Integer.parseInt(kk[1]);
int x2 = Integer.parseInt(kk[2]), y2 = Integer.parseInt(kk[3]);
String s = x1 + ":" + y1, ss = x2 + ":" + y2;
add(s, x2, y2);
add(ss, x1, y1);
}
bfs();
pw.printf("%.2f", ans / (n * n));
pw.flush();
}
public static void bfs() {
Queue<int []> q = new LinkedList<>();
q.add(new int[] {n, n});//从终点开始往前走,走到每一个点
arr[n][n] = 0;
int xa,ya;
while (!q.isEmpty()) {//队列为空时结束
int []t=q.poll();//弹出队头
int x=t[0],y=t[1];
for(int i=-1;i<2;i+=2){//上下两边的判断
xa=x+i;
if(pd(xa,y)){
q.add(new int[]{xa,y});//加入队列
arr[xa][y]=arr[x][y]+1;//到达这一个位置的最小步数
ans+=arr[xa][y];//计数
}
}
for(int i=-1;i<2;i+=2){//左右两边的判断
ya=y+i;
if(pd(x,ya)){
q.add(new int[]{x,ya});//加入队列
arr[x][ya]=arr[x][y]+1;//到达这一个位置的最小步数
ans+=arr[x][ya];//计数
}
}
String key = x + ":" + y;
if (map.containsKey(key)) {//传送阵的判断
List<int[]> li = map.get(key);
for (int[] b: li) {
if (pd(b[0], b[1])) {
q.add(new int[] {b[0], b[1]});//加入队列
arr[b[0]][b[1]] = arr[x][y]+1;//到达这一个位置的最小步数
ans+=arr[b[0]][b[1]];//计数
}
}
}
}
}
public static void add(String key, int x, int y) {//存放传送阵
List<int[]> li = map.getOrDefault(key, new ArrayList<>());
li.add(new int[] {x, y});
map.put(key, li);
}
public static boolean pd(int x, int y) {//判断改点是否在迷宫范围内且为经过
if (x>=1&&x<=n&&y>=1&&y<=n&&arr[x][y]==0&&x*y<n*n) return true;
return false;
}
public static int nextInt() throws Exception {//int型
st.nextToken();
return (int) st.nval;
}
public static long nextLong() throws Exception {//long型
st.nextToken();
return (long) st.nval;
}
}
if(count==99998)那个要与if(sushu(i))并列.
import java.util.Scanner;
//1:无需package
//2: 类名必须Main, 不可修改
public class Main {
public static void main(String[] args) {
int count=0;
//在此输入您的代码...
for(int i=9;;i++){
if(sushu(i)){
count++;
}
if(count==99998){
System.out.println(i);
break;
}
}
}
public static boolean sushu(int n){
for(int i=2;i<=Math.sqrt(n);i++){
if(n%i==0){
return false;
}
}
return true;
}
}
这题经典的DFS题目,首先看题目需要用到的方法,首先我们要构造exch方法,对每一个数进行交换,实现所有的可能,同时还需构造一个check方法,看看是否满足题目要求(要求编号相邻的书不能放在相邻的位置。)。由于知道需要回溯,所以构造dfs方法,在dfs中调用check以及exch方法实现对所有可能的筛选。
public class Main {
static int []arr={1,2,3,4,5,6,7,8,9,10};
static int ans=0;
public static void main(String[] args) {
dfs(0);
System.out.println(ans);
}
static void dfs(int k){
if(k==arr.length){
if(check()){
ans++;
}
}
for(int i=k;i<arr.length;i++){
exch(i,k);
dfs(k+1);
exch(i,k);
}
}
static boolean check(){
for(int i=0;i<arr.length-1;i++){
if(Math.abs(arr[i+1]-arr[i])==1){
return false;
}
}
return true;
}
static void exch(int a,int b){
int temp;
temp=arr[a];
arr[a]=arr[b];
arr[b]=temp;
}
}
这题好难,看了题解才勉强看懂,可能刚接触双指针不太了解。这题的思路主要是判断 arr[L][1]是否等于arr[R][1](当不等于的时候,判断这时候是否符合热帖的概念,即:arr[R][0]-arr[L][0]
import java.util.Arrays;
import java.io.*;
public class Shuangzhizhen {
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
static StreamTokenizer st = new StreamTokenizer(br);
static PrintWriter pw = new PrintWriter(new OutputStreamWriter(System.out));
public static void main(String[] args) throws Exception {
int n=nextInt();
int d=nextInt();
int k=nextInt();
int[][]arr=new int[n][2];
for(int i=0;i<n;i++){
arr[i][0]=nextInt();
arr[i][1]=nextInt();
}
Arrays.sort(arr,((a,b)->{
if(a[1]!=b[1]){
return a[1]-b[1];
}
return a[0]-b[0];
}));
int t=0,s=0;
int []brr=new int[n];
int l=0;
for(int r=0;r<n;r++){
if(arr[r][1]!=arr[l][1]){
if(t==1){
brr[s++]=arr[l][1];
}
t=0;
l=r;
}
if(arr[r][0]-arr[l][0]>=d){
l++;
}
if(r-l+1>=k){
t=1;
}
}
if(t==1){
brr[s++]=arr[n-1][1];}
for(int i=0;i<s;i++){
pw.println(brr[i]);
pw.flush();
}
}
public static int nextInt() throws Exception {//int型
st.nextToken();
return (int) st.nval;
}
public static long nextLong() throws Exception {//long型
st.nextToken();
return (long) st.nval;
}
}
自己来看,最多只能暴力拿分。System.out.println((n*(n+1)/2)+2);不过看了怂佬的题解才明白,说实话这道题看起来不难,但实际上完全理解要花较多头脑。对了这里用到的return,当找到合适的数的时候,return会跳出当前的方法,不去执行最后System.out.println((n*(n+1)/2)+2);这一段代码了,这个时候就不能用break了。
import java.util.Scanner;
// 1:无需package
// 2: 类名必须Main, 不可修改
public class Main {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
//在此输入您的代码...
long n=scan.nextLong();
int []arr=new int[44725];
arr[0]=1;
long k=1L;
if(n==1){
System.out.println(1);
}
for(int i=1;i<44725;i++){
for(int j=i;j>=1;j--){
arr[j]+=arr[j-1];
if(arr[j]==n){
System.out.println(k+i-j+1);//前四行所有的数加上当前行数i(i为当前行有多少个数)-j+1;
return;
}
}
k+=i+1;
}
System.out.println((n*(n+1)/2)+2);
scan.close();
}
}
import java.util.Scanner;
// 1:无需package
// 2: 类名必须Main, 不可修改
public class Main {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
//在此输入您的代码...
System.out.println(19+20*21+4);
scan.close();
}
}
import java.util.Scanner;
// 1:无需package
// 2: 类名必须Main, 不可修改
public class Main {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
long a=scan.nextLong();
long b=scan.nextLong();
long n=scan.nextLong();
long j=a*5+b*2;//每周刷的题目
long k=n/j;//刷了多少周
long d=n-k*j;//剩余题目
long l=0;
if(d==0){
System.out.println(k*7);
}else{
for(int i=1;i<=7;i++){
if(i<=5){
l+=a;
}
if(i>5){
l+=b;
}
if(l>=d){
System.out.println(k*7+i);
return;
}
}
}
}
}
import java.util.Scanner;
// 1:无需package
// 2: 类名必须Main, 不可修改
public class Main {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
//在此输入您的代码...
int n=scan.nextInt();
for(int i=1;i<=n;i++){
if(i==1){
System.out.println((n-1)*2);
}
if(i>1&&i<=n/2){
System.out.println((n-i)*2);
}//左边的点
if(n%2==1&&i==n/2+1){
System.out.println((i-1)*2);
}//中间点
if(n%2==1&&i>=n/2+2&&i<n){
System.out.println((i-1)*2);
}//n为奇数,右侧的点
if(n%2==0&&i>=n/2+1&&i<n){
System.out.println((i-1)*2);
}//n为偶数,右边的点
if(i==n){
System.out.println((n-1)*2);
return;
}
}
}
}
前缀和+哈希表,看One佬的。自己写想着把输入的数组成一个字符串,然后用substring的方法取区间,将每个区间里面的每一个数进行相加,进行判断是否为K的倍数,最后统计符合条件的个数,但是自己不懂怎么将输入的数组成一个字符串,因为题目是每一行输入一个数,不懂得怎么将每一行的每一个数组合起来然后转成字符串转。
import java.io.*;
import java.util.*;
public class Main {
static BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
static PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(System.out)));
static int N = (int)1e5 + 10, n, k;
static int[] a = new int[N], pre = new int[N];
static Map<Integer, Integer> map = new HashMap<>();
public static void main(String[] args) throws Exception {
String[] s = in.readLine().split(" ");
n = Integer.parseInt(s[0]);
k = Integer.parseInt(s[1]);
for (int i = 1; i <= n; i++) {
a[i] = Integer.parseInt(in.readLine());
pre[i] = (pre[i - 1] + a[i]) % k;
}
long ans = 0L;
for (int i = 0; i <= n; i++) {
ans += map.getOrDefault(pre[i], 0);
map.put(pre[i], map.getOrDefault(pre[i], 0) + 1);
}
out.println(ans);
out.flush();
in.close();
}
}
这道题首先将从1-20210的数转成字符串str,再对其进行循环,循环范围为str.length,将每一个字符串的每一位进行遍历,用str.charAt()的方法来找1,每找到1个1,count++。
import java.util.Scanner;
// 1:无需package
// 2: 类名必须Main, 不可修改
public class Main {
public static void main(String[] args) {
int count=0;
for (int i = 1; i < 20210; i++) {
String str=i+"";
for (int j = 0; j < str.length(); j++) {
if(str.charAt(j)=='1')
{
count++;
}
}
if(count==2021)
{
System.out.println(str);
break;
}
}
scan.close();
}
}
一道简单的动态规划问题。题目首先定义dp[]的含义,然后定义dp[]的初值,由于需要选取最小的一个路径,所以需要用到 Max.min的方法。同时这道题目需要用到辗转相除法求得最大公约数,然后再求最小 公倍数。
import java.util.Scanner;
//1:无需package
//2: 类名必须Main, 不可修改
public class Main {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
//在此输入您的代码...
int n=2021;
int []dp=new int[n+1];//表示从1-目标结点的最短路径,则dp[2021]为题目所求。
dp[1]=0;
for(int i=2;i<=2021;i++){
dp[i]=Integer.MAX_VALUE;//初始化
}
for(int i=1;i<=2020;i++){
for(int j=i+1;j<=2021&&(j-i)<=21;j++){
dp[j]=Math.min(dp[j],dp[i]+zxgbs(i,j));
}
}
System.out.println(dp[2021]);
scan.close();
}
public static int gcd(int a,int b){
return b!=0 ? gcd(b,a%b):a;//辗转相除法求最大公约数,如果b等于0,则返回a。,如果不等于0继续辗转相除。
}
public static int zxgbs(int a,int b){
return a*b/gcd(a,b);
}
}
从键盘输入一个字符串,首先将字符串里的每一个字符遍历,所以用到一个for循环,str里的每一个字符减去’A’或者65(因为A的二进制代码为65)。将减去所得的结果归纳到一个数组里面。后面判断数组的最大值来找到出现最多次数的字母。最后再判断数组里最大的值是否唯一,如果不唯一,则输出最大值所在数组位置的字符。
import java.util.Scanner;
//1:无需package
//2: 类名必须Main, 不可修改
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
//在此输入您的代码...
int[]m=new int[26];
String str;
str=sc.next();
for(int i=0;i<str.length();i++){
m[(int)(str.charAt(i)-'A')]++;
}
int max=0;
for(int i=0;i<m.length;i++){
max=Math.max(max,m[i]);
}
for(int i=0;i<m.length;i++){
if(m[i]==max){
System.out.print((char)(i+'A'));
}
}
sc.close();
}
}
类似01背包的问题
import java.util.Arrays;
import java.util.Comparator;
import java.util.Scanner;
//1:无需package
//2: 类名必须Main, 不可修改
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
//在此输入您的代码...
int []sj={0,31,28,31,30,31,30,31,31,30,31,30,31};
int [][]arr=new int[1010][2];
boolean [][]pd=new boolean[1010][5010];
int n=sc.nextInt();
int m=sc.nextInt();
int k=sc.nextInt();
for(int i=1;i<=12;i++){
sj[i]+=sj[i-1];
}
for(int i=1;i<=n;i++){
arr[i][0]=sj[sc.nextInt()-1]+sc.nextInt();//
arr[i][1]=sc.nextInt();
}
Arrays.sort(arr,1,n+1,Comparator.comparingInt(a->a[0]));
pd[0][0]=true;
int l=0;
int max=0;
for(int i=1;i<=n;i++){
while(arr[i][0]-arr[l+1][0]>=k)l++;
for(int j=0;j<=m;j++){
pd[i][j]=pd[i-1][j];
if(j>=arr[i][1]&&pd[l][j-arr[i][1]]==true){
pd[i][j]=true;
max=Math.max(max,j);
}
}
}
System.out.println(max);
sc.close();
}
}
需要注意一点只需要算末尾的0,不算前面的,所以不要从头开始循环,要从末尾开始。
import java.util.Scanner;
// 1:无需package
// 2: 类名必须Main, 不可修改
public class Main {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
//在此输入您的代码...
String str=scan.nextLine();
int sum=0;
for(int i=str.length()-1;i>=0;i--){
if(str.charAt(i)=='0'){
sum++;
}else{
break;
}
}
System.out.println(sum);
scan.close();
}
}
import java.util.Scanner;
// 1:无需package
// 2: 类名必须Main, 不可修改
public class Main {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
//在此输入您的代码...
for(int i=1000000;i>=2;i--){
if(check(i)){
System.out.println(i);
return;
}
}
scan.close();
}
public static boolean check(int n){
String str=n+"";
for(int i=0;i<str.length();i++){
for(int j=i+1;j<=str.length();j++){
int k=Integer.parseInt(str.substring(i,j));
if(!zhishu(k)){
return false;
}
}
}
return true;
}
public static boolean zhishu(int m){
if(m==1){
return false;
}
for(int i=2;i<=Math.sqrt(m);i++){
if(m%i==0){
return false;
}
}
return true;
}
}
二分查找
import java.io.*;
import java.util.Scanner;
public class Main {
static PrintWriter out =new PrintWriter(System.out);
static BufferedReader ins=new BufferedReader(new InputStreamReader(System.in));
static StreamTokenizer in=new StreamTokenizer(ins);
static int[]a;
static int[]b;
static int n;
static long m;
public static void main(String[] args) throws IOException {
String[] s=ins.readLine().split(" ");
n=Integer.parseInt(s[0]);
m=Long.parseLong(s[1]);
a=new int[n];
b=new int[n];
String[] s2=ins.readLine().split(" ");
for (int i = 0; i < n; i++) {
a[i]=Integer.parseInt(s2[i]);
}
String[] s3=ins.readLine().split(" ");
for (int i = 0; i < n; i++) {
b[i]=Integer.parseInt(s3[i]);
}
int l=0;
int r=2*n;
int ans=0;
while (l<=r){
int mid=(l+r)/2;
if(check(mid)){
ans=mid;
l=mid+1;
}else {
r=mid-1;
}
}
out.println(ans);
out.flush();
}
static boolean check(int t){
long temp=m;
for (int i = 0; i < n; i++) {
if(a[i]>=t)continue;
if(b[i]+a[i]<t)return false;
if(temp+a[i]<t)return false;
if(t-a[i]<=temp){
temp-=(t-a[i]);
}else{
return false;
}
}
return true;
}
}
构造两个方法,一个判断是否为闰年,一个用来计算年月日位数和。
import java.util.Scanner;
public class Main {
static int count;
static int[] days={0,31,28,31,30,31,30,31,31,30,31,30,31};
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
for(int i=1900;i<=9999;i++){
days[2]=isLeap(i)?29:28;
for(int j=1;j<=12;j++){
for(int k=1;k<=days[j];k++){
if(count(i)==count(j)+count(k)){
count++;
}
}
}
}
System.out.println(count);
scan.close();
}
public static boolean isLeap(int year){
return (year%4==0&&year%100!=0)||year%400==0;
}
public static int count(int n){
int m=0;
while(n>0){
m+=n%10;
n=n/10;
}
return m;
}
}
这题手算的,需要注意59分和00分算同一次。59*7+(95-14+1)+(35-1+1)
public class Main {
public static void main(String[] args) {
System.out.println(494);
}
}
这道题主要是靠权值来给原数组进行排序,这时候我们要定义一个二维数组,用Arrays.sort(nums,1,n+1,(a,b)->(a[1]-b[1]));(必须记住)。
import java.util.Arrays;
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();
int [][]nums=new int [n+1][2];
for(int i=1;i<=n;i++){
nums[i][0]=i;
}
int l=0;
int r=n;
while(m-->0){
String dir=sc.next();
int num=sc.nextInt();
if(dir.equals("L")){
nums[num][1]=--l;
}
else{
nums[num][1]=++r;
}
}
Arrays.sort(nums,1,n+1,(a,b)->(a[1]-b[1]));
for(int i=1;i<=n;i++){
System.out.printf("%d ",nums[i][0]);
}
sc.close();
}
}
人脑神经计算法
import java.util.Scanner;
// 1:无需package
// 2: 类名必须Main, 不可修改
public class Main {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
System.out.println(97+99+99+97+98);
scan.close();
}
}
这道题主要涉及到去重,所以我们要想到HashSet方法里set的去重 ,而对于子串,可以用substring来取每一个子串。
import java.util.Scanner;
import java.util.HashSet;
import java.util.Set;
// 1:无需package
// 2: 类名必须Main, 不可修改
//将字符串的每一个字串输出,统计有多少个字串,看看字串是否相等,将一样的字符串归为一种
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
//在此输入您的代码...
String str="0100110001010001";
Set<String> set=new HashSet<>();
for(int i=0;i<str.length();i++){
for(int j=i+1;j<=str.length();j++){
String s=str.substring(i,j);
set.add(s);
}
}
System.out.println(set.size());
sc.close();
}
}
注意找最小公差。
import java.util.Scanner;
// 1:无需package
// 2: 类名必须Main, 不可修改
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
//在此输入您的代码...
int n=sc.nextInt();
int []nums=new int[n];
for(int i=0;i<n;i++){
nums[i]=sc.nextInt();
}//输入整数
Arrays.sort(nums);//从小到大排列输入的数字
int min=Integer.MAX_VALUE;//找到最小的差构成等差数列
for(int i=1;i<n;i++){
if(nums[i]-nums[i-1]<min){
min=nums[i]-nums[i-1];//两两比较找出最小差
}
}
if(min==0){
System.out.println(n);
return;
}
int res=(nums[n-1]-nums[0])/min+1;//最大的数-最小的数/公差+1=该数列的个数
System.out.println(res);
sc.close();
}
}