腾讯笔试简单题解
第一题,通过找到每个点的连通是否都红,直接与运算
n,m = (int(i) for i in input().split(" "))
dic = {}
for i in range(m):
f,t,c = (i for i in input().split(" "))
f = int(f)
t = int(t)
if dic.get(f) is None: dic[f] = c=="R"
else: dic[f] = dic[f] and c=="R"
if dic.get(t) is None: dic[t] = c=="R"
else: dic[t] = dic[t] and c=="R"
res = 0
for i in range(1,n+1):
if dic.get(i) is None or dic.get(i):
res+=1
print(res)
第二题,找有几个降序节点,超过两个返回false,不知道为什么只过了90???
public boolean[] canSorted (ListNode[] lists) {
boolean[] res = new boolean[lists.length];
Arrays.fill(res,true);
for(int i= 0;i<lists.length;i++){
ListNode n = lists[i];
int pre=0;
while(n.next!=null){
if(n.next.val<n.val){
pre++;
if(pre>=2){
res[i] = false;
break;
}
}
n = n.next;
}
}
return res;
}
第三题:并查集变形,记录顶级父节点拥有子节点数
class Main {
public static void main(String[] args) {
class Tu{
int[][] fa;
int cnt;
public Tu(int n){
this.fa = new int[n+1][2];
for(int i=1;i<=n;i++){
this.fa[i][0] = i;
this.fa[i][1] = 1;
}
this.cnt = n;
}
public boolean isc(int f,int t){
return this.find(f)==this.find(t);
}
public int find(int f){
if(this.fa[f][0]==f){
return f;
}
int ff = find(this.fa[f][0]);
this.fa[f][0] = ff;
return ff;
}
public void ins(int f,int t){
int ff = this.find(f);
this.fa[t][0] = ff;
this.fa[ff][1]++;
this.fa[t][1] = 0;
this.cnt--;
}
}
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int m= in.nextInt();
Tu tu = new Tu(n);
for(int i=0;i<m;i++){
int f= in.nextInt(),t= in.nextInt();
if(!tu.isc(f,t)){
tu.ins(f,t);
}
}
int res = 1;
if(tu.cnt>2){
System.out.println(0);
}else{
for(int[] t: tu.fa){
res*=t[1]>0?t[1]:1;
}
System.out.println(res);
}
}
}
第四题:爆搜直接超时,就不贴了
第五题:不带回溯的爆搜
class Main {
public static char[] tt = "tencent".toCharArray();
public static int res;
public static int[][] mv = new int[][]{{1,0},{-1,0},{0,1},{0,-1}};
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
res = 0;
int n = in.nextInt();
int m = in.nextInt();
char[][] ch = new char[n][m];
in.nextLine();
List<int[]> lst = new ArrayList<>();
for(int i=0;i<n;i++){
ch[i] = in.nextLine().toCharArray();
for(int j = 0;j<m;j++){
if(ch[i][j]=='t'){
lst.add(new int[]{i,j});
}
}
}
for(int[] start: lst){
dfs(ch,start[0],start[1],0);
}
System.out.println(res);
}
public static void dfs(char[][] ch,int x,int y,int ind){
if(ind==6){
if(tt[ind]==ch[x][y]){
res++;
}
return;
}
if(ch[x][y]!=tt[ind]){
return;
}
for(int[] m:mv){
int xx = x+m[0],yy = y+m[1];
if(xx>=0 && xx<ch.length && yy>=0
&& yy<ch[0].length){
dfs(ch,xx,yy,ind+1);
}
}
}
}
#腾讯笔试##腾讯##笔试#