第一题
题目描述
要开发一款教育类APP,帮助幼儿在识数阶段做一百以内自然数[0,99]的加减法。屏幕上会显示"0", “1”,“2”,“3”, “4”, “5”, “6”, “7”, “8”,“9”,"+","-","=“这些按钮,用户在按了若干按钮之后,如果按了”=",则会把"="之前的字符串作为一个算式,计算结果。中间结果或最后结果可以为负数。
输入描述
输入为一个字符串,形如"23+86-6+37+24-8-13"。
输入字符串中保证:
- 不会包含除"0", “1”,“2”,“3”, “4”, “5”, “6”, “7”, “8”,“9”,"+","-"之外的字符
- 长度不为0
- 不以"+“或者”-“开始;不以”+“或”-"结束
- 不会出现连续两个或者两个以上"+“或者”-"
输出描述
输出为算式的结果
AC代码
package com.csk.huawei;
import java.util.Scanner;
import java.util.Stack;
/**
* Created by changsk on 2019/3/21
*/
public class Calc {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while(scanner.hasNext()){
String s = scanner.next();
int res1 = calcMethod1(s);
//int res2 = calcMethod2(s);
System.out.println(res1);
//System.out.println(res2);
}
}
private static int calcMethod1(String s){
Stack<Integer> stack = new Stack<>();
int i = 0;
char[] chars = s.toCharArray();
int len = chars.length;
int fuhao = -1;
while(i < len){
int num = 0;
while(i < len && chars[i] <= '9' && chars[i] >= '0'){
num = num * 10 + (chars[i] - '0');
i++;
}
stack.push(num);
if(stack.size() == 2){
int n2 = stack.pop();
int n1 = stack.pop();
int res = 0;
if(fuhao == 0) res = n1 - n2;
else if(fuhao == 1) res = n1 + n2;
stack.push(res);
System.out.println(res);
}
if(i < len && chars[i] == '-') fuhao = 0;
else if(i < len && chars[i] == '+') fuhao = 1;
i++;
}
return stack.pop();
}
private static int calcMethod2(String s){
int n1 = -1;
int n2 = -1;
char[] chars = s.toCharArray();
int len = chars.length;
int i = 0;
boolean fuhao = false;
while(i < len){
int num = 0;
while(i < len && chars[i] <= '9' && chars[i] >= '0'){
num = num * 10 + (chars[i] - '0');
i++;
}
if(n1 == -1) n1 = num;
else n2 = num;
if(n2 != -1){
int res = 0;
if(fuhao) res = n1 + n2;
else res = n1 - n2;
n1 = res;
}
if(i < len && chars[i] == '-') fuhao = false;
else if(i < len && chars[i] == '+') fuhao = true;
i++;
}
return n1;
}
}
第二题
题目描述
输入一个字符串(不含空格),请寻找输入中包含的所有蛇形字符串。
蛇形字符串的定义:
- 蛇形字符串由连续字符对组成,其特点如下:
1.1 字符对定义:字符对由同一字母的大写和小写组成(前大后小),如:Aa,Dd
1.2 蛇形字符串中包含的字符对,必须是连续字母,并按照字母顺序排序。如:AaBbCc,OoPpRrSs - 从输入中寻找字符组成蛇形字符串(字符顺序不限),符合规则:
2.1 每次寻找必须是最长的蛇形字符串
2.2 使用过的字符串不能重复使用
输入描述
一个字符串(不含空格,字符串长度<= 5000)
输出描述
- 所有包含的蛇形字符串,按首字母升序排列(即A在Z前)
- 同一个首字母的情况,按照蛇形字符串长度降序输出
- 如果没有找到,输出Not Found
AC代码
package com.csk.huawei;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Scanner;
/**
* Created by changsk on 2019/3/21
*/
//SxxsrR^AaSs
public class SnakeString {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while(scanner.hasNext()){
String s = scanner.next();
snakeString(s);
}
}
private static void snakeString(String s){
List<String> list = new ArrayList<>();
char[] chars = s.toCharArray();
int[] lowerLetter = new int[26];
int[] upperLetter = new int[26];
for(int i = 0;i < chars.length;i++){
if(chars[i] >= 'A' && chars[i] <= 'Z') upperLetter[chars[i] - 'A']++;
if(chars[i] >= 'a' && chars[i] <= 'z') lowerLetter[chars[i] - 'a']++;
}
int pairs = 0; //大小写的对数
for(int i = 0;i < lowerLetter.length;i++){
int min = Math.min(lowerLetter[i], upperLetter[i]);
upperLetter[i] = min;
lowerLetter[i] = min;
pairs += (min != 0) ? min : 0;
}
if(pairs == 0)
System.out.println("Not Found");
while(pairs != 0){
int start = 0, len = 0, max = 0, st = 0;
for(int i = 0;i < 26;i++){
len = 0;
if(upperLetter[i] != 0){
st = i;
i++;
len++;
while(i < 26 && upperLetter[i] != 0) {
len++;
i++;
}
if(len > max){
start = st;
max = len;
}
}
}
StringBuilder sb = new StringBuilder();
for(int i = start;i < start + max;i++){
pairs--;
sb.append((char)(i + 'A'));
sb.append((char)(i + 'a'));
//System.out.print((char)(i + 'A'));
//System.out.print((char)(i + 'a'));
lowerLetter[i]--;
upperLetter[i]--;
}
list.add(sb.toString());
}
Collections.sort(list);
for(String str : list)
System.out.println(str);
}
}
第三题
题目太长。。。