1. 程式人生 > >2018有贊校招筆試題

2018有贊校招筆試題

昨天晚上參加了有贊校招Java類筆試,題目總體難度適中,這裡我給大家分享一下這次筆試的三個程式設計題。

第一題:
1.題目
這裡寫圖片描述
這裡寫圖片描述

2.思路
我對這個題目的基本思路是用空格分隔字串得到字串陣列,該字串陣列元素可能是空,也可能是包含單詞和空格的字串。然後將陣列轉換成List,對List的每個元素處理成開頭大寫、之後小寫的形式再輸出。

3.實現
以下程式碼是我的實現:

package com.liu.date20171017;

import java.util.*;

/**
 * 2018有贊筆試程式設計題第一題:字串轉換
 * Created by Herry on 2017/10/17.
 */
public class TransferString { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); String input = scanner.nextLine(); transfer(input); //transferList(input); } //方法一:普通迭代器實現(筆試時100%通過測試用例) public static void transfer(String input) { List<String> numList = new
ArrayList(Arrays.asList(input.split(" "))); ArrayList result = new ArrayList<String>(); Iterator<String> it = numList.iterator(); while(it.hasNext()) { String item = it.next(); if(item.equals("")) { it.remove(); continue
; } item = item.toUpperCase().charAt(0) + item.substring(1).toLowerCase(); result.add(item); } //JDK1.8中不需要迴圈輸出。因為筆試時牛客網只提供JDK 1.7,不能使用String類的jion()來拼接字串,所以這裡通過迴圈輸出 for(int i = 0; i < result.size() -1; i ++) { System.out.print(result.get(i) + " "); } System.out.print(result.get(result.size() -1)); //JDK 1.8輸出方式。不需要迴圈輸出,換用下面的輸出即可 //System.out.print(String.join(" ", result)); } //方法二:List專用迭代器實現(未經過測試用例測試) public static void transferList(String input) { List<String> numList = new ArrayList(Arrays.asList(input.split(" "))); ListIterator<String> it = numList.listIterator(); while(it.hasNext()) { String item = it.next(); if(item.equals("")) { it.remove(); continue; } it.set(item.toUpperCase().charAt(0) + item.substring(1).toLowerCase()); } System.out.print(String.join(" ", numList)); } }

需要說明的是,實現中使用了兩種方式,第一種是採用普通迭代器實現的,普通迭代器不能在元素遍歷的時候對元素進行修改,所以只能用另外一個List來接收處理後的元素,輸出時也有JDK版本的區分。第二種是採用List專用迭代器實現的,這種迭代器支援在元素遍歷的時候對元素進行修改,所以不用額外用List接收處理後的元素。

第二題:
1.題目
這裡寫圖片描述
這裡寫圖片描述

2.思路
我一開始是採用最原始的窮舉法來做的,就是從較小的數開始一個一個往下測試是否滿足同時整除給定的兩個數,這種思路不滿足題目對於效能的要求。後來參考了網上的思路,採用輾轉相除的方式來實現。

3.實現
以下程式碼是我的實現:

package com.liu.date20171017;

import java.util.Scanner;

/**
 * 2018有贊筆試程式設計題第二題:求兩個數的最大公約數
 * Created by Herry on 2017/10/17.
 */
public class GreatestCommonDivisor {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        long num1 = scanner.nextLong();
        long num2 = scanner.nextLong();

        System.out.print(getGCD(num1, num2));
    }

    //方法一:該方法由於複雜度比較大,只能部分通過測試用例
    public static long getGreatestCommonDivisor(long num1, long num2) {
        long d = num1 < num2 ? num1 : num2; //約數
        while (d >= 1) {
            if (num1 % d == 0 && num2 % d == 0) {
                break;
            }
            d--;
        }
        return d;
    }

    //方法二:100%通過測試用例
    public static long getGCD(long num1, long num2)   // 迴圈實現
    {
        long k = 0, y = 0;
        if(num1 < num2)
        {
            k = num1;
            num1 = num2;
            num2 = k;
        }
        while(num1 % num2 != 0)
        {
            y = num1 % num2;
            num1 = num2;
            num2 = y;
        }
        return num2;
    }
}

我在網上還看到一種相減的方法可以求得兩個數的最大公約數,有興趣的朋友可以自行搜尋學習。

第三題

  1. 列表內容
    這裡寫圖片描述
    這裡寫圖片描述

2.思路
我的思路還是比較原始,就是對於陣列的每個元素,從該元素的下一個元素開始遍歷整個陣列,找到第一個比它大的元素就返回,如果沒有找到即返回-1。但是這種方式的複雜度不滿足題設要求,只通過了10%,還請做出了這道題的大神指點。

3.實現

package com.liu.date20171017;

import java.util.Scanner;

/**
 * 2018有贊筆試程式設計題第三題:列印每個陣列元素的NGE(NGE為元素右邊第一個比它大的元素)
 * <已實現演算法不完善,只通過10%>
 * Created by Herry on 2017/10/17.
 */
public class PrintNGE {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        long[] nums = new long[n];

        // 獲取輸入
        for (int i = 0; i < n; i ++) {
            nums[i] = scanner.nextLong();
        }

        //測試用例通過率為10%
        for(int j = 0; j < n -1; j ++) {
            int flag = 0;
            for (int k = j + 1; k < n; k ++) {
                if(nums[j] < nums[k]) {
                    System.out.println(nums[k]);
                    flag  = 1;
                    break;
                }
            }
            if(flag == 0) {
                System.out.println("-1");
            }
        }
        System.out.println("-1");
    }
}

總結:總體來說,這幾道題的難度都不是很大,重在平時多練習,多注重對效能的追求。以上內容中,一些演算法沒有完全通過測試用例,還有些是考完之後我補充的實現方式,所以未用完善的測試用例測試,所以可能存在錯誤之處,要是發現了的話,還望指正。同時,對於以上未完全通過測試的題目,還望大神指點。如有大神有更好的實現方式,也望不吝賜教,不勝感激!

相關推薦

2018試題

昨天晚上參加了有贊校招Java類筆試,題目總體難度適中,這裡我給大家分享一下這次筆試的三個程式設計題。 第一題: 1.題目 2.思路 我對這個題目的基本思路是用空格分隔字串得到字串陣列,該字串陣列元素可能是空,也可能是包含單詞和空格的字串。然後將

2018 CVTE 前端試題整理

簡單的 三欄布局 位置 back 左右 blue color for循環 結果 昨天晚上(7.20)做了CVTE的前端筆試,總共三十道題,28道多選題,2道編程題 。做完了之後覺得自己基礎還是不夠紮實,故在此整理出答案,讓自己能從中得到收獲,同時給日後的同學一些參考。 首先

2018網易試題——web前端開發

週六同學參加網易校招筆試,她投的前端開發,我也順便看了兩眼,題目並不算很難。第二道程式設計還和京東校招筆試題一樣(雖然我沒做出來....)。 我只記得第一題... 然而當時並沒有幫我同學調出來.....但是剛才只用了十多分鐘就做完了...... 所以其實校招筆試題並不難 題

2018華為試題

校招題1 字串重排給定一個原始字串,統計字串中各字元出現的次數,並按照ASCII碼遞增的順序依次輸出。例:原始字串為eeefgghh統計字串中各字元的出現次數:        e : 3        f  : 1        g : 2        h : 2重排字串輸

1~n的全排列--閱文集團2018試題

put ron class 校招 next() tostring return bsp 輸出格式 題目大意:給定整數n,求出1~n的全排列 示例 輸入:n=3 輸出:[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1] 1 im

觸寶科技2018試題

#include <iostream> #include <string> #include <vector> using namespace std; void find(vector<string>& ve,vect

2018京東試題-資料分析崗

題目大意是給出一個數字n,問a^b=c^d(1<=a、b、c、d<=n)這種式子的個數 1^2=1^1 1^1=1^2,這樣的算兩個,n<=100000. 首先分析題目,n的資料範圍肯定是不能暴力的,從其他同學的反饋也表示這題暴力只能過20% 此題的規律在

【網易】2018試題

一丶魔法幣  小易準備去魔法王國採購魔法神器,購買魔法神器需要使用魔法幣,但是小易現在一枚魔法幣都沒有,但是小易有兩臺魔法機器可以通過投入x(x可以為0)個魔法幣產生更多的魔法幣。魔法機器1:如果投入x

阿里巴巴2018試題

前幾天做了阿里的2018的校招筆試題,我投的崗位是Java研發,在這裡跟大家分享下筆試題及我的解法。 1、 題目 由於當時時間比較緊,只有四十分鐘,但是題目也只有一道,可能我比較渣,所以時間很趕,沒來得及截圖,下面是我對題目的大致記憶。 大致意思是給定

劍指Offer/滴滴2018試題-找出陣列中第K大元素-雙路快排實現

程式設計題例項 滴滴2018校招筆試題程式設計題2: 找出陣列中第K大的元素 輸入 45,66,58,22 2 輸出 45 程式設計原理 這道題與

大疆2018試題

大疆的題,挺複雜,最起碼描述是的。。。 底下的答案僅供參考,沒有一道是全部AC的。 //兩個小車,走一步能量消耗1,方向為1向右,-1為向左,首先輸入路途長度,然後輸入兩行,每行第一個為小車的能量,第二個位小車起始位置,第三個為方向。求幾個小車可以走出去? #includ

2018科大訊飛試題

原題如下: 爭吵 時間限制:C/C++語言 2000MS;其他語言 4000MS 記憶體限制:C/C++語言 65536KB;其他語言 589824KB 題目描述: 有 n 個人排成了一行佇列,每個人都有一個站立的方向:面向左或面向右。由於這 n 個人中每個人都很討厭其他的

試題編程技巧總結

hid sca 筆試 result div else 總結 class ash 技巧一://統計字符串s1的頻率 String s1 = in.nextLine(); //統計字符串s1的頻率 for (char c1 : s1.toCharAr

面經

校招已經過去一年,在此掛出去年有贊校招面經,一輪卒 淚奔 sychronized 加兩個sychronize可以嗎? 和可重入鎖有什麼區別? synchronized擁有強制原子性的內部鎖機制

位元組跳動2019屆試題

1.世界盃開幕式會在球場C舉行,球場C的球迷看臺可以容納M*N個球迷。在球場售票完成後,現官方想統計此次開幕式一共有多少個球隊球迷群體,最大的球隊球迷群體有多少人。 經調研發現,球迷群體在選座時有以下特性: 同球隊的球迷群體會選擇相鄰座位,不同球隊的球迷群體會選

位元組跳動2019屆試題

2.為了提高文章質量,每一篇文章(假設全部都是英文)都會有m民編輯進行稽核,每個編輯獨立工作,會把覺得有問題的句子通過下表記錄下來,比如[1,10],1表示病句的第一個字元,10表示病句的最後一個字元。也就是從1到10著10個字元組成的句子,是有問題的。 現在需

思特奇2019試題

描述系統對外提供的所有服務,因此介面中的成員常量和方法都必須是公開(public)型別的,確保外部使用者能訪問它們; 介面僅僅描述系統能做什麼,但不指明如何去做,所以介面中的方法都是抽象(abstract)方法; 介面不涉及和任何具體例項相關的細節,因此介面沒有構造方法,

騰訊試題之小Q的歌單

題目 小Q的歌單 熱度指數:1624 時間限制:1秒 空間限制:32768K 小Q有X首長度為A的不同的歌和Y首長度為B的不同的歌,現在小Q想用這些歌組成一個總長度正好為K的歌單,每首歌最多隻能在歌單中出現一次,在不考慮歌單內歌曲的先後順序的情況下

美團點評試題

美團點評1 1:在網路7層協議中,如果想使用UDP協議達到TCP協議的效果,可以在哪層做文章? 因為UDP要達到TCP的功能就必須實現擁塞控制的功能,而且是在路由之間實現,這個在底層明顯是做不到擁塞控制的,在應用層也是做不到的,因為應用層之間和應用程式掛鉤,一般

阿里java試題——程式碼塊中語句的執行順序

下面是阿里java校招的一道筆試題,程式碼如下: public class HelloA { //構造方法 public HelloA(){ System.out.println("Hello A!父類構造方法"); } //非靜態