1. 程式人生 > >華為2017上合地區碼上來試試模擬試題

華為2017上合地區碼上來試試模擬試題

1. 前言

今天上合地區的2017級的模擬試卷放了出來, 做了一下還是相當簡單的。由於本人其實不太熟悉java, 不過我們家大美女需要考java, 所以就順便實現了一下java 的版本~~

2. 題目

這裡寫圖片描述
這裡寫圖片描述
這裡寫圖片描述

3. 解答

3.1 挑選大寫字元

這道題目其實蠻簡單的, 只要遍歷一下將大寫字元和空格保留下來就可以了

3.1.1 C++ 部分實現

#include <iostream>
#include <string>
#include <algorithm>
#include <vector>
#include <list>
using namespace std; int main(){ string str; while (getline(cin, str)){ string res; for (int i = 0; i != str.size(); i++){ if (str[i] >= 'A' && str[i] <= 'Z' || str[i] == ' ') res += str[i]; } cout << res << endl; } return
0; }

3.1.2 java 版本

使用了一個StringBuilder 用來做字串的拼接

import java.util.Scanner;
import java.util.*;

public class Main{
    public static void main(String args[]){
        Scanner cin = new Scanner(System.in);
        String line;        
        while (cin.hasNext()){
            StringBuilder res = new
StringBuilder(); line = cin.nextLine(); for (int i = 0; i != line.length(); i++){ if ((line.charAt(i) >= 'A' && line.charAt(i) <= 'Z' ) || (line.charAt(i) == ' ')){ res.append(line.charAt(i)); } } System.out.println(res); } } }

3.2 剩餘檔案數

本質上這題還是字串的操作,邏輯上只需要做簡單的加減運算就可以了

3.2.1 C++ 實現

#include <iostream>
#include <string>
#include <algorithm>
#include <vector>
#include <list>

using namespace std;

int main(){
    string line;
    while (getline(cin, line)){
        int num = 0;
        do {
            int pos = 0;
            int last = 0;
            if ((pos = line.find(' ', last)) != -1) {
                string sub = line.substr(last, pos - last);
                if (sub == "binding"){
                    sub = line.substr(pos + 1);
                    num += stoi(sub);
                }
                else if (sub == "remove"){
                    sub = line.substr(pos + 1);
                    int rem = stoi(sub);
                    num = max(num - rem, 0);
                }               
            }
            else
                break;
        } while (getline(cin, line));
        cout << "current " << num << endl;
    }   
    return 0;
}

3.2.2 java 實現

import java.util.Scanner;
import java.util.*;

public class Main{
    public static void main(String args[]){
        Scanner cin = new Scanner(System.in);
        String line;    
        while (cin.hasNext()){
            int sum = 0;
            while (true){
                line = cin.nextLine();
                String[] arr = line.split(" ");
                if (arr.length == 2){
                    if (arr[0].equals("binding")){
                        sum += Integer.parseInt(arr[1]);
                    }else{
                        sum -= Integer.parseInt(arr[1]);
                        sum = Math.max(sum, 0);
                    }
                }
                else{
                    break;
                }
            }
            System.out.println("current " + sum);
        }
    }
}

3.3 定時器

這道題目, 感覺其實需要使用一個連結串列, 因為主要涉及的操作都是增刪

3.3.1 C++

#include <iostream>
#include <string>
#include <algorithm>
#include <vector>
#include <list>

using namespace std;

struct DATA{
    int id;
    int time;
    DATA(int id, int time) :id(id), time(time){}
};

int main(){
    string line;
    while (getline(cin, line)){
        int pos = 0;
        string sub;
        list<DATA> mylist;
        do {
            if ((pos = line.find(':')) != -1){
                sub = line.substr(0, pos);
                if (sub == "starttimer"){
                    int last = pos + 1;
                    pos = line.find(',');
                    int id = stoi(line.substr(last, pos - last));
                    int time = stoi(line.substr(pos + 1));
                    mylist.push_back(DATA(id, time));
                }
                else if (sub == "stoptimer"){
                    int id = stoi(line.substr(pos + 1));
                    list<DATA>::iterator iter = mylist.begin();
                    while(iter != mylist.end()){
                        if (iter->id == id){
                            list<DATA>::iterator next = ++iter;
                            --iter;
                            mylist.erase(iter);
                            iter = next;
                        }
                        else
                            iter++;
                    }
                }
                else{
                    int time = stoi(line.substr(pos + 1));
                    list<DATA>::iterator iter = mylist.begin();
                    while (iter != mylist.end()){
                        if (iter->time <= time){
                            list<DATA>::iterator next = ++iter;
                            --iter;
                            mylist.erase(iter);
                            iter = next;
                        }
                        else{
                            iter->time -= time;
                            iter++;
                        }

                    }
                }
            }
            else
                break;
        } while (getline(cin, line));

        // output
        list<DATA>::iterator iter = mylist.begin();
        if (iter != mylist.end()){
            while (iter != mylist.end()){
                cout << "timer:" << iter->id << "," << iter->time << endl;
                iter++;
            }
        }
        else{
            cout << "none" << endl;
        }

    }


    return 0;
}

3.3.2 java

3.3.2.1 自定義連結串列

這裡涉及一個類中類的概念, 定義器來還是非常討厭的

import java.util.Scanner;
import java.util.*;

public class Main{      
    public class DATA{
        public int id;
        public int time;
        public DATA next;

        DATA(int id, int time){
            this.id = id;
            this.time = time;
            next = null;
        }
    }

public static void main(String args[]){
    Scanner cin = new Scanner(System.in);
    String line;    
    Main main = new Main();

    while (cin.hasNext()){
        Main.DATA mylist = main.new DATA(0, 0);
        Main.DATA p = mylist;

        while (true){
            line = cin.nextLine();
            String[] arr = line.split(":");
            if (arr.length == 2){
                if (arr[0].equals("starttimer")){
                    String[] subline = arr[1].split(",");
                    int id = Integer.parseInt(subline[0]);
                    int time  = Integer.parseInt(subline[1]);
                    Main.DATA data = main.new DATA(id, time);

                    p.next = data;      
                    p = p.next;
                } else if (arr[0].equals("stoptimer")){
                    int id = Integer.parseInt(arr[1]);

                    Main.DATA pre = mylist;
                    Main.DATA cur = pre.next;
                    while (cur != null){
                        if (cur.id == id){
                            // delete
                            pre.next = cur.next;
                            cur = pre.next;
                        }
                        else{
                            cur = cur.next;
                            pre = pre.next;
                        }
                    }

                }else{
                    int time = Integer.parseInt(arr[1]);

                    Main.DATA pre = mylist;
                    Main.DATA cur = pre.next;
                    while (cur != null){
                        cur.time -= time;
                        if (cur.time <= 0){
                            // delete
                            pre.next = cur.next;
                            cur = pre.next;
                        }
                        else{
                            cur = cur.next;
                            pre = pre.next;
                        }
                    }
                }
            }
            else{
                break;
            }
        }

        // out
        Main.DATA pre = mylist;
        Main.DATA cur = pre.next;

        if (cur != null){
            while (cur != null){
                System.out.println("timer:" + cur.id + "," + cur.time);
                cur = cur.next;
            }
        }
        else{
            System.out.println("none");
        }


    }
}
}

3.3.2.2 使用連結串列容器

下面呢, 是使用java 自帶的連結串列容器寫的, 也非常簡單, 就是不太熟悉, 然後接寫成了上面那種方式了

import java.util.Scanner;
import java.util.*;


public class Main{      
public static void main(String args[]){
    Scanner cin = new Scanner(System.in);
    String line;    

    while (cin.hasNext()){
        List<int []> mylist = new LinkedList<>();       

        while (true){
            line = cin.nextLine();
            String[] arr = line.split(":");
            if (arr.length == 2){
                if (arr[0].equals("starttimer")){
                    String[] subline = arr[1].split(",");
                    int id = Integer.parseInt(subline[0].trim());
                    int time  = Integer.parseInt(subline[1].trim());
                    int [] arr1 = {id, time};
                    mylist.add(arr1);

                } else if (arr[0].equals("stoptimer")){
                    int id = Integer.parseInt(arr[1].trim());

                    for (int i = 0; i != mylist.size(); ){
                        int [] arr1 = mylist.get(i);
                        if (arr1[0] == id){
                            mylist.remove(i);
                        }
                        else
                            i++;
                    }                   

                }else{
                    int time = Integer.parseInt(arr[1].trim());

                    for (int i = 0; i != mylist.size();){
                        int [] arr1 = mylist.get(i);
                        arr1[1] -= time;
                        mylist.set(i, arr1);
                        if (arr1[1] <= 0){
                            mylist.remove(i);
                        }
                        else{
                            i++;
                        }
                    }       
                }
            }
            else{
                break;
            }
        }

        // out
        if (mylist.size() > 0){
            for (int i = 0; i != mylist.size(); i++){
                int [] cur = mylist.get(i);
                System.out.println("timer:" + cur[0] + "," + cur[1]);
            }       
        }
        else{
            System.out.println("none");
        }       
    }
}
}