周赛排名(457 / 1707):(
第一题:1317. 将整数转换为两个无零整数的和
解题思路:题目给出了一个n,需要你返回两个数,且返回的两个值中不存在0(比如:101,110就是不合法的,前导0不算)。这里直接暴力的去枚举第一个值a,那么第二个值就是n-a,然后我是直接把数字转成String,去找0。若不存在,返回。
代码:
class Solution {
public int[] getNoZeroIntegers(int n) {
int[] ans = new int[2];
for (int i = 1; i < n; i++) {
int t = n-i;
String s = String.valueOf(t);
String s1 = String.valueOf(i);
if (s.indexOf("0")==-1 && s1.indexOf("0")==-1 ){
ans[0]=i;
ans[1]=t;
return ans;
}
}
return ans;
}
}
第二题:1318. 或运算的最小翻转次数
解题思路:题意很明显考的就是位运算,可以使用每一次右移一位,然后&1来判定当前位为0或1(周赛过程中偷懒,直接用了java中的函数,直接转成二进制做了。。。),之后的判断就简单了。
代码:
class Solution {
public int minFlips(int a, int b, int c) {
String s = Integer.toBinaryString(a);
StringBuilder sb1 = new StringBuilder(s);
String s1 = Integer.toBinaryString(b);
StringBuilder sb2 = new StringBuilder(s1);
String s2 = Integer.toBinaryString(c);
StringBuilder sb3 = new StringBuilder(s2);
int n = s.length();
n=Math.max(s1.length(),n);
n=Math.max(s2.length(),n);
if (s.length()!=n){
for (int i = 0; i < n - s.length(); i++) {
sb1.insert(0,'0');
}
}
if (s1.length()!=n){
for (int i = 0; i < n - s1.length(); i++) {
sb2.insert(0,'0');
}
}
if (s2.length()!=n){
for (int i = 0; i < n - s2.length(); i++) {
sb3.insert(0,'0');
}
}
int ans=0;
for (int i = 0; i < n; i++) {
if (sb3.charAt(i)=='1'){
if (sb1.charAt(i)!='1' && sb2.charAt(i)!='1')
ans++;
}
if (sb3.charAt(i)=='0'){
if (sb1.charAt(i)=='1') ans++;
if (sb2.charAt(i)=='1') ans++;
}
}
return ans;
}
}
第三题:1319. 连通网络的操作次数
解题思路:使用union-find查出并集个数,之后返回并集个数-1即可,(ps:周赛过程中,想用set来强行自己找并集,之后超时了(先是10000的用例超时了,剪枝了之后4.9w的用例又挂了:(),没有使用过union-find的悲哀。。。)
代码:
class Solution {
int[] pre;
int count;
public int makeConnected(int n, int[][] connections) {
pre = new int[n];
count = n;
int line = connections.length;
if (n-1>line) return -1;
for (int i = 0; i < n; i++) {
pre[i] = i;
}
for (int [] a:connections) {
union(a[0],a[1]);
}
return count-1;
}
public int find(int n){
int r = n;
while (r!=pre[r]){
r=pre[r];
}
return r;
}
void union(int n1,int n2){
int r1 = find(n1);
int r2 = find(n2);
if (r1!=r2){
count--;
pre[r1]=r2;
}
}
}