華為2017上合地區碼上來試試模擬試題
阿新 • • 發佈:2019-02-11
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");
}
}
}
}