题解,Java

Posted 炒饭加蛋挞

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了题解,Java相关的知识,希望对你有一定的参考价值。

题解 

Codeforces Round 860 (Div. 2)
A-Showstopper
思路:对同一位的ai,bi进行a[n],b[n]不交换,a[n],b[n]交换,a[i],b[i]交换比较

#include<iostream>
#include<cstring>
using namespace std;
int a[110], b[110];
int main()

    ios::sync_with_stdio(false);
    int t;
    cin >> t;
    while (t--) 
        memset(a, 0, sizeof(a));
        memset(b, 0, sizeof(b));
        int n;
        cin >> n;
        for (int i = 1; i <= n; i++) 
            cin >> a[i];
        
        for (int i = 1; i <= n; i++) 
            cin >> b[i];
        
        bool flag = 0;
        for (int i = 1; i <= n; i++) 
            if (a[i] > a[n] || b[i] > b[n]) 
                if (a[i] > b[n] || b[i] > a[n])    //交换后
                    if (b[i] > a[n] || a[i] > b[n])
                        flag = 1;
                
            
        
        if (flag)
            cout << "NO" << '\\n';
        else
            cout << "YES" << '\\n';
    
    return 0;


B-Three Sevens
思路:二维数组存不下,建立vector,从后往前推,对于每天没出现的编号挑选一个,若无答案为-1

#include<bits/stdc++.h>
#include<iostream>
#include<vector>
#include<map>
#include<set>
#include<cstring>
const int maxn = 5e4 + 10;
using namespace std;
vector<int>v[maxn];
vector<int>e;
bool vis[maxn];
void solve() 
    e.clear();
    memset(vis, 0, sizeof(vis));
    int n;
    cin >> n;
    for (int i = 1; i <= n; i++) 
        v[i].clear();
        int m;
        cin >> m;
        for (int j = 1; j <= m; j++) 
            int a;
            cin >> a;
            v[i].push_back(a);
        
    
    for (int j = n; j >= 1; j--) 
        bool flag = 0;
        for (auto k = v[j].begin(); k != v[j].end(); k++) 
            if (!vis[*k] && !flag) 
                flag = 1;
                e.push_back(*k);
            
            vis[*k] = 1;
        
        if (!flag) 
            cout << "-1" << "\\n";
            return;
        
    
    reverse(e.begin(), e.end());
    for (auto k = e.begin(); k != e.end(); k++) 
        cout << *k << ' ';
    
    cout << '\\n';

int main()

    ios::sync_with_stdio(false);
    int t;
    cin >> t;
    while (t--) 
        solve();
    


C. Candy Store
思路:性质:范围内(xi*yi)的最大公约数*范围内yi的最小公倍数=zi,
 不断更新范围内最小公倍数,最大公约数 ,当最大公约数%最小公倍数不等于0时,
 更换最小公倍数,最大公约数同时ans++

#include<bits/stdc++.h>
#include<iostream>
#include<queue>
#include<map>
#define int long long
const int maxn = 1e6 + 10;
using namespace std;
int gcd(int a, int b)                     //辗转相除法求最大公约数
    return !b ? a : gcd(b, a % b);

struct node 
    int x, y;
a[maxn];
void solve() 
    int n;
    cin >> n;
    for (int i = 1; i <= n; i++) 
        cin >> a[i].x >> a[i].y;
    
    int ans = 1;
    int t = a[1].y;
    int c = a[1].x * a[1].y;
    for (int i = 2; i <= n; i++) 
        t = t * a[i].y / gcd(t, a[i].y);    //范围内最小公倍数
        c = gcd(c, a[i].x * a[i].y);          //xi*yi范围内的最大公约数
        if (c % t) 
            ans++;
            c = a[i].x * a[i].y;
            t = a[i].y;
        
    
    cout << ans << '\\n';

signed main()

    ios::sync_with_stdio(false);
    int t;
    cin >> t;
    while (t--) 
        solve();
    
    return 0;


D. Shocking Arrangement
 错解:目的出现错误,贪心使之小于Max

#include<bits/stdc++.h>
#include<iostream>
#include<queue>
#include<algorithm>
#include<set>
#include<math.h>
#include<vector>
using namespace std;
#define int long long
const int maxn = 3e5 + 10;
vector<int>p;              //set默认从小到大排列并且去重不采用
queue<int>q;
void solve() 
    int n;
    cin >> n;
    if (n == 1) 
        int a;
        cin >> a;
        cout << "No" << '\\n';
        return;
    
    for (int i = 1; i <= n; i++) 
        int a;
        cin >> a;
        p.push_back(a);
      
    sort(p.begin(), p.end());          //
    //sort(p.begin(), p.end(), greater<int>()); //从大到小排序
    auto Max = *p.rbegin() - *p.begin();
    int sum = 0;
    while (!p.empty()) 
        sum = abs(sum + *p.rbegin());
        if (sum <= Max) 
            q.push(*p.rbegin());
            p.pop_back();
        
        else 
            sum = abs(sum - *p.rbegin());
            sum = abs(sum + *p.begin());
            if (sum > Max) 
                cout << "No" << '\\n';
                p.clear();
                q = queue<int>();                      //队列的清空:赋初值
                return;
            
            else 
                q.push(*p.begin());
                p.erase(p.begin());
            
        
    
    cout << "Yes" << '\\n';
    while (!q.empty()) 
        cout << q.front() << ' ';
        q.pop();
    
    cout << '\\n';

signed main()
    ios::sync_with_stdio(0);
    int t;
    cin >> t;
    while(t--) 
        solve();
    
    return 0;


思路:目的:使得区间内范围相加abs最小,即使之靠近0的这个值
 当sum>0时,选择最小,当sum<=0时选择最大,考虑全为0的特殊情况
 

#inclide<bits/stdc++.h>
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
#define int long long
int mod = 1e7 + 7;
void solve() 
    int n;
    cin >> n;
    int zero = 0;
    vector<int>v;
    for (int i = 0; i < n; i++)
        int x;
        cin >> x;
        if (x == 0)
            zero++;
        else
            v.push_back(x);
    
    if (zero == n)                    //全为0的情况
        cout << "NO\\n";
    else
        sort(v.begin(), v.end());
        vector<int>ans;
        while (zero--)
            ans.push_back(0);
        int sum = 0;
        int l = 0, r = v.size() - 1;
        while (l <= r)
            if (sum >= 0)
                ans.push_back(v[l]);
                sum += v[l];
                l++;
            
            else
                ans.push_back(v[r]);
                sum += v[r];
                r--;
            
        
        cout << "YES\\n";
        for (auto i : ans)
            cout << i << " ";
        cout << '\\n';
    

signed main()

    int t;
    cin >> t;
    while (t--)
        solve();
    
    return 0;

第一次测试

A - Super Ryuma 
思路:两点重合,0步,直接满足三种条件,1步,满足1,2;2,3;1,3;3,3;两步,否则三步

#include<iostream>
typedef long long ll;
using namespace std;
int main()

    ios::sync_with_stdio(false);
    ll a, b, c, d;
    cin >> a >> b >> c >> d;
    if (a == c && b == d)
        cout << 0 << '\\n';
    else if (a + b == c + d || a - b == c - d || abs(a - c) + abs(b - d) <= 3)  //直接满足三种条件
        cout << 1 << '\\n';
    else   //图形
        if (abs(a - c) + abs(b - d) <= 6)  //两次第三种情况:两步方框距离
            cout << 2 << '\\n'; 
        else
            int flag = 0;
            for (int i = a - 3; i <= a + 3; i++)                 //第一种与第三种,第二种与第三种
                for (int j = b - 3; j <= b + 3; j++)         //找方框里面能否有直接斜线到终点的
                    if (abs(i - a) + abs(j - b) <= 3 && i + j == c + d || i - j == c - d)
                        flag = 1;
                
            if (flag) 
                cout << 2 <<'\\n';
            else                                                          //第一种与第二种
                if (((a + b) & 1LL) == ((c + d) & 1LL)) cout << 2 <<'\\n'; //看对角线奇偶性
                else cout << 3 << '\\n';
            
        
    
    return 0;

简化版
 

#include <iostream>
#include<math.h>
using namespace std;
int main()   
    long long a, b, c, d;
    cin >> a >> b >> c >> d;
        long long p = abs(c - a), q = abs(d - b);
        if (p == 0 && q == 0) cout << '0' << '\\n';
        else if (p == q || p + q <= 3) cout << '1' << '\\n';//1,3;2,3曼哈顿距离小于等于3即可
        else if ((p + q) % 2 == 0 || p + q <= 6 || abs(p - q) <= 3) cout << '2' << '\\n';
        else     cout << '3' << '\\n';


F - Third Avenue
思路:bfs,防止时间超限,将传送门用vector<PI>g[26]存储,遇见传送门传送且每个字母只能用一次
 

#include<iostream>
#include<queue>
#include<vector>
using namespace std;
#define PI pair<int,int>
const int maxm = 2e3 + 5;
int dir[4][2] =  1,0,0,1,-1,0,0,-1 ;
int mark[maxm][maxm];
char s[maxm][maxm];
vector<PI> g[26];
int vis[26];
PI st, ed;
int n, m;
struct node 
    int x,y;
;
void bfs() 
    queue<PI>q;
    q.push(st);
    mark[st.first][st.second] = 1;
    while (!q.empty()) 
        int x = q.front().first;
        int y = q.front().second;
        q.pop();
        for (int k = 0; k < 4; k++) 
            int xx = x + dir[k][0];
            int yy = y + dir[k][1];
            if (xx <= 0 || xx > n || yy <= 0 || yy > m|| mark[xx][yy]|| s[xx][yy] == '#')
                continue;
            mark[xx][yy] = mark[x][y] + 1;
            q.push( xx,yy );
        
        if (s[x][y] >= 'a' && s[x][y] <= 'z') 
            if (!vis[s[x][y] - 'a']) //每种字母只能用一次
                vis[s[x][y] - 'a'] = 1;
                for (auto i : g[s[x][y] - 'a']) 
                    if (mark[i.first][i.second])continue;
                    mark[i.first][i.second] = mark[x][y] + 1;
                    q.push(i);
                
            
        
    

int main() 
    cin >> n >> m;
    for (int i = 1; i <= n; i++) 
        for (int j = 1; j <= m; j++) 
            cin >> s[i][j];
            if (s[i][j] == 'S') 
                st =  i,j ;
            
            else if (s[i][j] == 'G') 
                ed =  i,j ;
            
            else if (s[i][j] >= 'a' && s[i][j] <= 'z') 
                g[s[i][j] - 'a'].push_back( i,j );
            
        
    
    bfs();
   cout<<mark[ed.first][ed.second] - 1<<'\\n';
    return 0;

java(4)

在书本对以前网上学到的知识点进行落实,发现书本上有很多网上没有涉及到区域,于是又重温了一遍,感觉对知识点理解加深了,整理出之前遗落的知识点,然后就是在代码进行动手能力加强

 

每日一刷与题解:Java基础知识+sql

JAVA基础题

在这里插入图片描述
题解:接口是多继承

在这里插入图片描述
题解:A、Set不允许存在重复元素,所以最多只能有一个空值
B、List可以有多个空值
C、Set不可以包含重复元素
D、Set是无序的

在这里插入图片描述
题解:

修饰符类中同包不同包的子类不同包非子类
publicYYYY
protectedYYYN
defaultYYNN
privateYNNN

在这里插入图片描述
在这里插入图片描述
题解:子类重写父类方法时,方法的访问权限不能小于原访问权限,在接口中,方法的默认权限就是public,所以子类重写后只能是public

下面程序的输出结果为( )

public class Demo {
    public static String sRet = "";
    public static void func(int i) {
        try {
            if (i % 2 == 0)
                throw new Exception();
        } catch (Exception e) {
            sRet += "0";
            return;
        } finally {
            sRet += "1";
        }
        sRet += "2";
    }
    public static void main(String[] args) {
        func(1);
        func(2);
        System.out.println(sRet);
    }
}

答案:1201
题解:
①调用func(1),if不符合,直接进入finally,sRet=“1"
②finally语句中没有返回值,故继续向下执行,sRet=“12”
③调用func(2),if符合,sRet=“120”,此时有返回值!!!
④调用finally语句,sRet=“1201”
⑤因为已经有返回值了,finally之后的语句也不再执行,sRet=“1201”。

在这里插入图片描述
题解:单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。
特点:
1、单例类只能有一个实例。
2、单例类必须自己创建自己的唯一实例。
3、单例类必须给所有其他对象提供这一实例。
优点:
1、在内存里只有一个实例,减少了内存的开销,尤其是频繁的创建和销毁实例)。
2、避免对资源的多重占用(比如写文件操作)。
缺点:
没有接口,不能继承,与单一职责原则冲突,一个类应该只关心内部逻辑,而不关心外面怎么样来实例化。

在这里插入图片描述
题解:眼花,没有看到d选项

  • int和int之间,用==比较,肯定为true。基本数据类型没有equals方法
  • int和Integer比较,Integer会自动拆箱,== 和 equals都肯定为true
  • int和new Integer比较,Integer会自动拆箱,调用intValue方法, 所以 == 和 equals都肯定为true
  • Integer和Integer比较的时候,由于直接赋值的话会进行自动的装箱。所以当值在[-128,127]中的时候,由于值缓存在IntegerCache中,那么当赋值在这个区间的时候,不会创建新的Integer对象,而是直接从缓存中获取已经创建好的Integer对象。而当大于这个区间的时候,会直接new Integer。
  • 当Integer和Integer进行==比较的时候,在[-128,127]区间的时候,为true。不在这个区间,则为false
  • 当Integer和Integer进行equals比较的时候,由于Integer的equals方法进行了重写,比较的是内容,所以为true
  • Integer和new Integer : new Integer会创建对象,存储在堆中。而Integer在[-128,127]中,从缓存中取,否则会new Integer.
    所以 Integer和new Integer 进行==比较的话,肯定为false ; Integer和new Integer 进行equals比较的话,肯定为true
  • new Integer和new Integer进行==比较的时候,肯定为false ; 进行equals比较的时候,肯定为true,原因是new的时候,会在堆中创建对象,分配的地址不同,==比较的是内存地址,所以肯定不同
  • 装箱过程是通过调用包装器的valueOf方法实现的
  • 拆箱过程是通过调用包装器的xxxValue方法实现的(xxx表示对应的基本数据类型)
    总结:Byte、Short、Integer、Long这几个类的valueOf方法实现类似的。所以在[-128,127]区间内,==比较的时候,值总是相等的(指向的是同一对象),在这个区间外是不等的。
    而Float和Double则不相等, Boolean的值总是相等的

在这里插入图片描述
题解:抽象类
特点:
1.抽象类中可以构造方法
2.抽象类中可以存在普通属性,方法,静态属性和方法。
3.抽象类中可以存在抽象方法。
4.如果一个类中有一个抽象方法,那么当前类一定是抽象类;抽象类中不一定有抽象方法。
5.抽象类中的抽象方法,需要有子类实现,如果子类不实现,则子类也需要定义为抽象的。
接口
1.在接口中只有方法的声明,没有方法体。
2.在接口中只有常量,因为定义的变量,在编译的时候都会默认加上
public static final
3.在接口中的方法,永远都被public来修饰。
4.接口中没有构造方法,也不能实例化接口的对象。
5.接口可以实现多继承
6.接口中定义的方法都需要有实现类来实现,如果实现类不能实现接口中的所有方法
7.则实现类定义为抽象类。

SQL语句

SQL44:将id=5以及emp_no=10001的行数据替换成id=5以及emp_no=10005

UPDATE titles_test
SET emp_no = REPLACE(emp_no, 10001, 10005)
WHERE id = 5;

SQL45:将titles_test表名修改为titles_2017

alter table titles_test rename titles_2017;

SQL46:在audit表上创建外键约束,其emp_no对应employees_test表的主键id

alter table 表名 addconstraint 约束名】 foreign key(字段名) references 主表(被引用列);
alter table audit add foreign key(emp_no) references employees_test(id);

SQL48:将所有获取奖金的员工当前的(salaries.to_date=‘9999-01-01’)薪水增加10%

//先连接两表再查询
update salaries s 
join emp_bonus e 
on s.emp_no=e.emp_no
set salary=salary*1.1
where to_date='9999-01-01'

SQL50:将employees表中的所有员工的last_name和first_name通过(’)连接起来

select concat(last_name,"'",first_name) 
from employees;

以上是关于题解,Java的主要内容,如果未能解决你的问题,请参考以下文章

javajava两个栈实现一个队列&两个队列实现一个栈

JavaJava与数字证书

JavaJava_12 Eclipse

javajava String 源码

JavaJava计时器(秒表)

如何使用拓展gcd算法算出ax+by=c的最小正整数解x——Looooops 题解