1. 程式人生 > >位元組跳動程式設計題

位元組跳動程式設計題

第一題

延禧攻略
皇宮之中,乾隆皇帝嬪妃眾多,分為多派,經常互相爭寵,乾隆皇帝正為此發愁,
他請魏瓔珞替他想想辦法,希望後宮之中儘可能少的分派。

魏瓔珞把後宮中的眾多嬪妃叫來,每位嬪妃將自己要好的姐妹名字寫在一張字條上。
只要名單中有對方名字,就表示想與對方交好,則分在一派。

例如高貴妃名單中有純妃,純妃名單中有富察皇后,則她們三人都會歸為一派,
如嫻妃名單中沒有任何人,其他嬪妃的名單中也沒有嫻妃,則嫻妃自己為一派。

魏瓔珞給每位嬪妃編上號,從1開始,共有n位嬪妃,每個人的名單寫上想要交好的嬪妃編號,名單後面以0結尾。

互相交好或者間接交好的嬪妃分為一派,最後魏瓔珞將分成的派別數上報給皇帝,皇帝十分滿意。
皇上詢問魏瓔珞是如何劃分的,魏瓔珞將統計的字條給皇上看,字條如下:

10     //有10位嬪妃
0	//1號嫻妃不想與任何人交好
5 3 0 	//2號則希望能與5號3號姐妹一起
8 4 0
9 0
9 0
3 0
0
7 9 0
0 
9 7 0
 
最後輸出派數為 2,除了1號自己為一派,其他人都分為另外一派

第二題

EE團隊共有n個人.大家都比較害羞.不善於與陌生人交流。
這n個人每個人都提供了自己認識的人的名字, 不包括自己。 

如果A的名単裡有B,或B的名單裡有A,則代表A與B互相認識。
同時如果A認識B, B認識C,則代表A與C也會很快的認識。畢竟通過B的介紹,兩個人就可以很快互相認識的了。

為了大闖關遊戲可以更好地團隊協作、 氣氛更活躍,並使得團隊中的人可以儘快的相互瞭解、認識和交流,
決定根據這個名單將團隊分為m組,每組人數可以不同,
但組內的任何一個人都與組內的其他所有人直接或間接的認識和交流。

如何確定一個方案,使得團隊可以分成m組.並且這個m儘可能地小呢?

輸入描述:
第一行一個整數n,代表有n個人,從1開始編號,接下來有n行,
第x+1行代表編號為x的人認識的人的編號k (1<=k<=n),每個人的名單以0代表結束,

輸出描述:
一個整數m,代表可以分到的最小的組的個數

例子:
10
0
5 3 0 
8 4 0
9 0
9 0
3 0
0
7 9 0
0 
9 7 0
 
輸出 2
1<=n<=100000

第三題

我們定文合法的標1只符為:數字0-9組成的字串, (可以包合多個前導0)
定義合法的表示式為:
    1.若X為合法的識別符號,則X為合法的表示式
    2.若X為合法的表示式,則(X)為合法的表示式
    3.若X和Y均為合法的表示式,則X+Y, X-Y均為合法的表示式
    如,以下均合法的表:1, 100, 1+2. (10),1-(3-2)
以下為不合法的表示式: (,-1, 1+-2
給定長度n,求長為n的合法表示式的數目,長為n的合法表示式可能有非常多, 你只需輸出結果對1000000007取模的餘數即可.
 
    輸入描述:一個整數n
    輸出描述:長度為n的合法表示式的樹木對1000000007取模的餘數
    輸入:1
    輸出10
0<=n<=1000

第四題

雙生詞是指滿足如下條件的兩個字串:(假設兩個字串分別為:S和S')
1 字串s與s'長度相同
2. 將字串S首尾相接繞成環 再選一個位置切開.順時針或逆時針能夠得到字串s'
 
容易得到.若S與s'為雙生詞.則s'與S也為雙生詞。
給定批僅由英文小寫字母組成的字串,詢問他們之中是否存在雙生詞,
 
輸入描述:
首先給出測試組數t,表示一共有多少組資料,
對於每組資料,第一行為一個整數n,表示一共有多少個字串
接下來n行,每行一個字串。
 
輸出描述:
對於每組資料,者存在雙生詞,輸出Yeah,若不存在雙生詞,輸出sad,
 
3
2
hellowor1d
hd1rowol1e
2
he1lowor1d
world-hel1o
2
abcde
acbde
 
輸出
Yeah
Yeah
Sad
1<=t<=10    n<100000  字串長度在1~32

-------------------------

------------------------------------------------------------------------------------------------------------------------------------------------------------------------

第三次

import java.util.*;
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String s = in.nextLine();
        if (s.length() == 0)
            System.out.println("0");
        else if (s.length() == 1)
            System.out.println("1");
        else {
            StringBuilder sb = new StringBuilder();
            List<Integer> result = new ArrayList<Integer>();
            String temp = "";
            for (int i = 0; i < s.length(); i++) {
                if (!sb.toString().contains(String.valueOf(s.charAt(i)))) {
                    sb.append(s.charAt(i));
                } else {
                    result.add(sb.length());
                    // 當發現字元重複的時候尋找重複字元在前面子串中最後一次出現的位置,
                    //把這個位置之後的子串中的子串加上當前迴圈到的字元作為新的子串繼續遍歷下去
                    if (sb.lastIndexOf(String.valueOf(s.charAt(i))) < sb.length() - 1)
                        temp = sb.substring(sb.lastIndexOf(String.valueOf(s.charAt(i))) + 1, sb.length())
                                + String.valueOf(s.charAt(i));
                    else
                        temp = String.valueOf(s.charAt(i));
                    sb.delete(0, sb.length());
                    sb.append(temp);
                }
                if (i == s.length() - 1)
                    result.add(sb.length());
            }
            Collections.sort(result);
            System.out.println( result.get(result.size() - 1) );
        }
    }
}


import java.util.*;
 
/*需求:對於一個只有0和1的二維矩陣,上下或者左右相鄰元素都為1則為一塊(斜著不算),求一共有多少取值為1的連續塊.如下圖:
 * 
 *   0 1 0 1 1 0
 *   1 1 0 0 1 1
 *   0 0 1 0 0 0
 *   1 1 0 0 0 0
 * 
 * 上圖中有4塊
 */
 
public class Main {
	// 共享成員變數,矩陣
	static int[][] rect = null;
	// 主函式
	public static void main(String[] args) {
		creatRect();
	}
 
	// 生成指定的隨機矩陣,計算塊數
	private static void creatRect() {
		// 設定矩陣的高和寬
        Scanner in = new Scanner(System.in);
        int m = in.nextInt();
        rect = new int[m][m];
        for (int i = 0; i < m; i++) {
			for (int j = 0; j < m; j++) {
				rect[i][j] = in.nextInt();
			}
		}
		//int h = 8;int w = 8;
		// 生成指定隨機矩陣int[i][j],並展示在控制檯;將元素值為1的元素存入List,並展示在控制檯
		/*Random rdm = new Random();
		rect = new int[h][w];
		System.out.println("隨機生成矩陣如下圖:");
		for (int i = 0; i < rect.length; i++) {
			for (int j = 0; j < rect[i].length; j++) {
				int k = rdm.nextInt(2);
				rect[i][j] = k;
				System.out.print(" " + rect[i][j]);
			}
			System.out.println();
		}*/
		//System.out.println("開始進行計算");
		// 開始計時
		long time = System.currentTimeMillis();
		// 計數
		int count = 0;
		// 遍歷矩陣找1,塊的定位
		for (int i = 0; i < rect.length; i++) {
			for (int j = 0; j < rect[i].length; j++) {
				// 當找到1時,開始處理其所在的塊
				if (rect[i][j] == 1) {
					block(i, j);
					count++;
				}
			}
		}
        System.out.println(count);
		// 輸出塊數
		// System.out.println("計算結束");
		//System.out.println("該矩陣中,共有" + count + "塊");
		// 輸出計時結果
		//System.out.println("計算用時(ms):" + (System.currentTimeMillis() - time));
	}
 
	// 判斷連續塊,遞迴
	private static void block(int i, int j) {
		// 修改(i,j)座標對應的陣列元素的值(避免遞迴時反覆判斷相鄰元素)
		rect[i][j] = 4;
		// 分別判斷上下左右
		if (i < rect.length - 1 && rect[i + 1][j] == 1) {
			block(i + 1, j);
		}
		if (i > 0 && rect[i - 1][j] == 1) {
			block(i - 1, j);
		}
		if (j < rect[i].length - 1 && rect[i][j + 1] == 1) {
			block(i, j + 1);
		}
		if (j > 0 && rect[i][j - 1] == 1) {
			block(i, j - 1);
		}
	}
 
}