2017網易秋招編程集合
阿新 • • 發佈:2017-08-12
bbc 移除 規則 解題思路 兩個 最短 蘋果 最小步數 將不
{1, 2, 1}, {15, 78, 78, 15} , {112} 是回文序列,
{1, 2, 2}, {15, 78, 87, 51} ,{112, 2, 11} 不是回文序列。
現在給出一個數字序列,允許使用一種轉換操作:
選擇任意兩個相鄰的數,然後從序列移除這兩個數,並用這兩個數字的和插入到這兩個數之前的位置(只插入一個和)。
現在對於所給序列要求出最少需要多少次操作可以將其變成回文序列。
例如:半徑的平方如果為25
優雅的點就有:(+/-3, +/-4), (+/-4, +/-3), (0, +/-5) (+/-5, 0),一共12個點。
這條石板路要根據特殊的規則才能前進:對於小易當前所在的編號為K的 石板,小易單次只能往前跳K的一個約數(不含1和K)步,即跳到K+X(X為K的一個非1和本身的約數)的位置。 小易當前處在編號為N的石板,他想跳到編號恰好為M的石板去,小易想知道最少需要跳躍幾次可以到達。
例如:
N = 4,M = 24:
4->6->8->12->18->24
於是小易最少需要跳躍5次,就可以從4號石板跳到24號石板
BAACAACCBAAA 連續子串"CBA"中包含了‘A‘,‘B‘,‘C‘各一個,所以是純凈的字符串
AABBCCAABB 不存在一個長度為3的連續子串包含‘A‘,‘B‘,‘C‘,所以是暗黑的字符串
你的任務就是計算出長度為n的字符串(只包含‘A‘、‘B‘和‘C‘),有多少個是暗黑的字符串。
如果 X = 123,則rev(X) = 321;
如果 X = 100,則rev(X) = 1.
現在給出整數x和y,要求rev(rev(x) + rev(y))為多少?
現在給出一個N,需要求出 f(1) + f(2) + f(3).......f(N)
例如: N = 7
f(1) + f(2) + f(3) + f(4) + f(5) + f(6) + f(7) = 1 + 1 + 3 + 1 + 5 + 3 + 7 = 21
小易計算這個問題遇到了困難,需要你來設計一個算法幫助他。
A - B, B - C, A + B, B + C. 這四個數值.每個字母代表每個人所擁有的糖果數.
現在需要通過這四個數值計算出每個人手裏有多少個糖果,即A,B,C。這裏保證最多只有一組整數A,B,C滿足所有題設條件。
CPP
http://blog.csdn.net/achiberx/article/details/74058208
[編程題]回文序列
如果一個數字序列逆置之後跟原序列是一樣的就稱這樣的數字序列為回文序列。例如:{1, 2, 1}, {15, 78, 78, 15} , {112} 是回文序列,
{1, 2, 2}, {15, 78, 87, 51} ,{112, 2, 11} 不是回文序列。
現在給出一個數字序列,允許使用一種轉換操作:
選擇任意兩個相鄰的數,然後從序列移除這兩個數,並用這兩個數字的和插入到這兩個數之前的位置(只插入一個和)。
現在對於所給序列要求出最少需要多少次操作可以將其變成回文序列。
輸入描述:
輸入為兩行,第一行為序列長度n ( 1 ≤ n ≤ 50) 第二行為序列中的n個整數item[i] (1 ≤ iteam[i] ≤ 1000),以空格分隔。
輸出描述:
輸出一個數,表示最少需要的轉換次數
輸入例子:
4 1 1 1 3
輸出例子:
2
解題思路:
將該序列左右兩端同時開始向中間合並。無論怎麽樣最終會變成一個數字,也只是最壞的一種情況。
源代碼:
[java] view plain copy
- import java.util.Scanner;
- /**
- *
- * @author 慕一春
- * @version 1.0.0
- * @filename Main.java
- * @time 2016-9-21 下午2:50:56
- * @copyright(C) 2016
- */
- public class Main {
- public static void main(String[] args) {
- Scanner sc = new Scanner(System.in);
- int arr[];
- while(sc.hasNext()){
- int n = sc.nextInt();
- arr = new int[n];
- for (int i = 0; i < n; i++){
- arr[i] = sc.nextInt();
- }
- System.out.println(solve(n, arr));
- }
- sc.close();
- }
- private static int solve(int n, int arr[]) {
- int left = 0;
- int right = n - 1;
- int ans = 0;
- while (left < right){
- if (arr[left] > arr[right]){
- arr[right-1] += arr[right];
- right--; ans++;
- }else if(arr[left] < arr[right]){
- arr[left+1] += arr[left];
- left++; ans++;
- }else{
- left++; right--;
- }
- }
- return ans;
- }
- }
[編程題] 優雅的點
小易有一個圓心在坐標原點的圓,小易知道圓的半徑的平方。小易認為在圓上的點而且橫縱坐標都是整數的點是優雅的,小易現在想尋找一個算法計算出優雅的點的個數,請你來幫幫他。例如:半徑的平方如果為25
優雅的點就有:(+/-3, +/-4), (+/-4, +/-3), (0, +/-5) (+/-5, 0),一共12個點。
輸入描述:
輸入為一個整數,即為圓半徑的平方,範圍在32位int範圍內。
輸出描述:
輸出為一個整數,即為優雅的點的個數
輸入例子:
25
輸出例子:
12
解題思路:
說白了就是求一個數能否寫成另外兩個數平方和? 一共有幾組呢?
源代碼:
[java] view plain copy
- import java.util.Scanner;
- /**
- *
- * @author 慕一春
- * @version 1.0.0
- * @filename Main.java
- * @time 2016-9-21 下午2:50:56
- * @copyright(C) 2016
- */
- public class Main {
- public static int sum = 0;
- public static void main(String[] args) {
- Scanner sc = new Scanner(System.in);
- int n = sc.nextInt();
- int x = 0,y = 0;
- for (int i=1; i*i <= n; i++){
- x = i*i;
- y = (int) Math.sqrt(n - x);
- if (x + y*y == n) {
- sum++;
- }
- }
- System.out.println(sum*4);
- }
- }
[編程題] 跳石板
小易來到了一條石板路前,每塊石板上從1挨著編號為:1、2、3.......這條石板路要根據特殊的規則才能前進:對於小易當前所在的編號為K的 石板,小易單次只能往前跳K的一個約數(不含1和K)步,即跳到K+X(X為K的一個非1和本身的約數)的位置。 小易當前處在編號為N的石板,他想跳到編號恰好為M的石板去,小易想知道最少需要跳躍幾次可以到達。
例如:
N = 4,M = 24:
4->6->8->12->18->24
於是小易最少需要跳躍5次,就可以從4號石板跳到24號石板
輸入描述:
輸入為一行,有兩個整數N,M,以空格隔開。 (4 ≤ N ≤ 100000) (N ≤ M ≤ 100000)
輸出描述:
輸出小易最少需要跳躍的步數,如果不能到達輸出-1
輸入例子:
4 24
輸出例子:
5
解題思路:
基礎的動態規劃問題
dp[i] 表示走到 i 位置需要的最短步數
在計算的時候,由於我們知道i位置的可以向前走的距離
當 i 位置可以走的時候,計算走到 i + x 位置時候的 最小步數
源代碼:
[java] view plain copy
- import java.util.Arrays;
- import java.util.Scanner;
- import java.util.TreeSet;
- /**
- *
- * @author 慕一春
- * @version 1.0.0
- * @filename Main.java
- * @time 2016-9-21 下午2:50:56
- * @copyright(C) 2016
- */
- public class Main {
- public static void main(String[] args) {
- Scanner sc = new Scanner(System.in);
- int n = sc.nextInt();
- int m = sc.nextInt();
- int dp[] = new int[m+1];
- Arrays.fill(dp, Integer.MAX_VALUE);
- dp[n] = 0; // 到達起始位置步數為0步
- for (int i = n; i <= m; i++){
- if (dp[i] == Integer.MAX_VALUE) dp[i] = -1;
- else{
- TreeSet<Integer> list = bcd(i);
- while (!list.isEmpty()){
- int temp = list.pollFirst();
- if (i + temp <= m)
- dp[i+temp] = Math.min(dp[i+temp], dp[i]+1);
- }
- }
- }
- System.out.println(dp[m]);
- }
- /**
- *
- * @author 慕一春
- * @param num
- * @return 一個數的最大公約數集list
- */
- public static TreeSet<Integer> bcd(int num){
- TreeSet<Integer> list = new TreeSet<Integer>();
- int len = (int) Math.sqrt(num);
- for (int i = 2; i <= len; i++){
- if (num % i == 0){
- list.add(i);
- list.add(num/i);
- }
- }
- return list;
- }
- }
[編程題] 暗黑的字符串
一個只包含‘A‘、‘B‘和‘C‘的字符串,如果存在某一段長度為3的連續子串中恰好‘A‘、‘B‘和‘C‘各有一個,那麽這個字符串就是純凈的,否則這個字符串就是暗黑的。例如:BAACAACCBAAA 連續子串"CBA"中包含了‘A‘,‘B‘,‘C‘各一個,所以是純凈的字符串
AABBCCAABB 不存在一個長度為3的連續子串包含‘A‘,‘B‘,‘C‘,所以是暗黑的字符串
你的任務就是計算出長度為n的字符串(只包含‘A‘、‘B‘和‘C‘),有多少個是暗黑的字符串。
輸入描述:
輸入一個整數n,表示字符串長度(1 ≤ n ≤ 30)
輸出描述:
輸出一個整數表示有多少個暗黑字符串
輸入例子:
2 3
輸出例子:
9 21
解題思路:
我們只需要考慮當前字符串最後兩個字母的兩種狀態: 相同,例如:AA等 不相同,例如:AB等
動態規劃,dp[i][0] 第i個字母以兩相同字母結尾的暗黑字符串,dp[i][1] 第i個字母以兩個不同字母結尾的暗黑字符串
狀態轉移方程式: dp[i][0] = dp[i-1][0] + dp[i-1][1] dp[i][1] = 2 * dp[i-1][0] + dp[i-1][1];
源代碼:
[java] view plain copy
- import java.util.Scanner;
- /**
- *
- * @author 慕一春
- * @version 1.0.0
- * @filename Main.java
- * @time 2016-9-21 下午2:50:56
- * @copyright(C) 2016
- */
- public class Main {
- public static void main(String[] args) {
- Scanner sc = new Scanner(System.in);
- int n = sc.nextInt();
- if (n == 1){
- System.out.println(3);
- return;
- }
- long dp[][] = new long[n+1][2];
- dp[1][0] = 0; dp[1][1] = 0;
- dp[2][0] = 3; dp[2][1] = 6;
- for (int i = 3; i <= n; i++){
- dp[i][0] = dp[i-1][0] + dp[i-1][1];
- dp[i][1] = 2 * dp[i-1][0] + dp[i-1][1];
- }
- System.out.println(dp[n][0] + dp[n][1]);
- }
- }
[編程題] 數字翻轉
對於一個整數X,定義操作rev(X)為將X按數位翻轉過來,並且去除掉前導0。例如:如果 X = 123,則rev(X) = 321;
如果 X = 100,則rev(X) = 1.
現在給出整數x和y,要求rev(rev(x) + rev(y))為多少?
輸入描述:
輸入為一行,x、y(1 ≤ x、y ≤ 1000),以空格隔開。
輸出描述:
輸出rev(rev(x) + rev(y))的值
輸入例子:
123 100
輸出例子:
223
解題思路:
5分鐘調試完,沒什麽難度。
源代碼:
[java] view plain copy
- import java.util.Scanner;
- /**
- *
- * @author 慕一春
- * @version 1.0.0
- * @filename Main.java
- * @time 2016-9-21 下午2:50:56
- * @copyright(C) 2016
- */
- public class Main {
- public static void main(String[] args) {
- Scanner sc = new Scanner(System.in);
- String x = sc.next();
- String y = sc.next();
- System.out.println(rev(String.valueOf(rev(x) + rev(y))));
- }
- public static int rev(String str){
- StringBuffer sb = new StringBuffer(str);
- return Integer.parseInt(sb.reverse().toString());
- }
- }
[編程題] 最大的奇約數
小易是一個數論愛好者,並且對於一個數的奇數約數十分感興趣。一天小易遇到這樣一個問題: 定義函數f(x)為x最大的奇數約數,x為正整數。 例如:f(44) = 11.現在給出一個N,需要求出 f(1) + f(2) + f(3).......f(N)
例如: N = 7
f(1) + f(2) + f(3) + f(4) + f(5) + f(6) + f(7) = 1 + 1 + 3 + 1 + 5 + 3 + 7 = 21
小易計算這個問題遇到了困難,需要你來設計一個算法幫助他。
輸入描述:
輸入一個整數N (1 ≤ N ≤ 1000000000)
輸出描述:
輸出一個整數,即為f(1) + f(2) + f(3).......f(N)
輸入例子:
7
輸出例子:
21
解題思路:
很明顯,f(n) 當n為奇數時,f(n) == n。
當n為偶數時,n不斷除以2,直到n為奇數記作n‘,即 f(n) == n‘ 。
推導狀態轉移方程式:
f(n)為奇數時, f(n) = f(n-1) + n;
f(n)為偶數時, f(n) = f(n/2) + 1 + 3 + 5 + ... + (n-1) ——> f(n) = f(n/2) + n*n/4 (一張紙,一支筆很快就可以寫出方程式。)
源代碼:
[java] view plain copy
- import java.math.BigInteger;
- import java.util.Scanner;
- /**
- *
- * @author 慕一春
- * @version 1.0.0
- * @filename Main.java
- * @time 2016-9-21 下午2:50:56
- * @copyright(C) 2016
- */
- public class Main {
- public static void main(String[] args) {
- Scanner sc = new Scanner(System.in);
- int n = sc.nextInt();
- System.out.println(solve1(n));
- System.out.println(solve2(n));
- }
- private static BigInteger solve2(int n) {
- BigInteger sum = BigInteger.ZERO;
- while (true){
- if (n == 1){
- sum = sum.add(BigInteger.ONE);
- break;
- }
- else if(n % 2 == 1) {
- sum = sum.add(BigInteger.valueOf(n));
- n--;
- }else{
- sum = sum.add(BigInteger.valueOf(n).multiply(BigInteger.valueOf(n)).divide(BigInteger.valueOf(4)));
- n /= 2;
- }
- }
- return sum;
- }
- public static BigInteger solve1(int n) {
- if (n == 1) return BigInteger.ONE;
- if (n % 2 == 1) return solve1(n-1).add(BigInteger.valueOf(n));
- else return solve1(n/2).add(BigInteger.valueOf(n).multiply(BigInteger.valueOf(n)).divide(BigInteger.valueOf(4)));
- }
- }
[編程題] 買蘋果
小易去附近的商店買蘋果,奸詐的商販使用了捆綁交易,只提供6個每袋和8個每袋的包裝(包裝不可拆分)。 可是小易現在只想購買恰好n個蘋果,小易想購買盡量少的袋數方便攜帶。如果不能購買恰好n個蘋果,小易將不會購買。輸入描述:
輸入一個整數n,表示小易想購買n(1 ≤ n ≤ 100)個蘋果
輸出描述:
輸出一個整數表示最少需要購買的袋數,如果不能買恰好n個蘋果則輸出-1
輸入例子:
20
輸出例子:
3
解題思路:
水題 ![1,100]的數據量暴力一下就好!
源代碼:
[java] view plain copy
- import java.util.Scanner;
- /**
- *
- * @author 慕一春
- * @version 1.0.0
- * @filename Main.java
- * @time 2016-9-21 下午2:50:56
- * @copyright(C) 2016
- */
- public class Main {
- public static void main(String[] args) {
- Scanner sc = new Scanner(System.in);
- int n = sc.nextInt();
- int r = n / 6;
- int c = n / 8;
- int min = Integer.MAX_VALUE;
- for (int i = 0; i <= r; i++){
- for (int j = 0; j <= c; j++){
- if (i*6 + j*8 == n){
- if (min > i+j) min = i+j;
- }
- }
- }
- if (min == Integer.MAX_VALUE) System.out.println(-1);
- else System.out.println(min);
- }
- }
[編程題] 計算糖果
A,B,C三個人是好朋友,每個人手裏都有一些糖果,我們不知道他們每個人手上具體有多少個糖果,但是我們知道以下的信息:A - B, B - C, A + B, B + C. 這四個數值.每個字母代表每個人所擁有的糖果數.
現在需要通過這四個數值計算出每個人手裏有多少個糖果,即A,B,C。這裏保證最多只有一組整數A,B,C滿足所有題設條件。
輸入描述:
輸入為一行,一共4個整數,分別為A - B,B - C,A + B,B + C,用空格隔開。 範圍均在-30到30之間(閉區間)。
輸出描述:
輸出為一行,如果存在滿足的整數A,B,C則按順序輸出A,B,C,用空格隔開,行末無空格。 如果不存在這樣的整數A,B,C,則輸出No
輸入例子:
1 -2 3 4
輸出例子:
2 1 3
解題思路:
3個未知數,僅需3個一元一次方程就可以解答。這裏多了一個就是一個限制條件而已了。 註意A,B,C都是整數!
源代碼:
[java] view plain copy
- import java.util.Scanner;
- /**
- *
- * @author 慕一春
- * @version 1.0.0
- * @filename Main.java
- * @time 2016-9-21 下午2:50:56
- * @copyright(C) 2016
- */
- public class Main {
- public static void main(String[] args) {
- Scanner sc = new Scanner(System.in);
- int a = sc.nextInt();
- int b = sc.nextInt();
- int c = sc.nextInt();
- int d = sc.nextInt();
- if ((a+c)%2!=0 || (b+d)%2!=0) System.out.println("No");
- else{
- int A = (a+c)/2;
- int B = A-a;
- int C = B-b;
- if (B+C == d)
- System.out.println(A+" "+B+" "+C);
- else
- System.out.println("No");
- }
- }
- }
2017網易秋招編程集合