字符串、集合、数组、基本数据类型是java里最基础的知识点,但也是频频被使用的,在算法题里属于高频基础题,下面结合一些题目来学习这些知识点。
描述
•连续输入字符串,请按长度为8拆分每个输入字符串并进行输出;
•长度不是8整数倍的字符串请在后面补数字0,空字符串不处理。
(注:本题有多组输入)
输入描述:
连续输入字符串(输入多次,每个字符串长度小于等于100)
输出描述:
依次输出所有分割后的长度为8的新字符串
示例1
输入:
abc
123456789
输出:
abc00000
12345678
90000000
解法1:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while(sc.hasNextLine()) {
String input = sc.nextLine();
StringBuilder sb = new StringBuilder();
// 计算补0个数
int num = 0;
int j = input.length() % 8;
if(j != 0) {
num = 8 - j;
}
// 补0
sb.append(input);
for(int k = 0; k < num; k++) {
sb.append("0");
}
for (int i = 0; i < sb.length() / 8; i++) {
System.out.println(sb.subSequence(8*i, 8*(i+1) ));
}
}
}
}
解法2:
import java.util.*;
public class Main{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
while(sc.hasNext()){
String str = sc.nextLine();
StringBuilder sb = new StringBuilder();//牢记字符串缓冲区的建立语法
sb.append(str);//字符串缓冲区的加入
int size = str.length();
int addZero = 8 - size%8;//addzero的可能值包括8
while((addZero > 0)&&(addZero<8)){//注意边界调节,避免addzero=8
sb.append("0");//使用‘’或“”都可
addZero--;
}
String str1 = sb.toString();
while(str1.length()>0){
System.out.println(str1.substring(0,8));
str1 = str1.substring(8);
}
}
}
}
总结:主要考察"%","/",String,StringBuilder,解法1在输出时使用StringBuilder.subSequence(int start, int end)来完成,解法2则把StringBuilder转为String,使用subString(int start,int end)的方式,少了一次for循环。
描述
将一个英文语句以单词为单位逆序排放。例如“I am a boy”,逆序排放后为“boy a am I”
所有单词之间用一个空格隔开,语句中除了英文字母外,不再包含其他字符
数据范围:输入的字符串长度满足
注意本题有多组输入
输入描述:
输入一个英文语句,每个单词用空格隔开。保证输入只包含空格和字母。
输出描述:
得到逆序的句子
示例1
输入:
I am a boy
复制
输出:
boy a am I
复制
示例2
输入:
nowcoder
复制
输出:
nowcoder
import java.util.*;
public class Main{
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
while(scan.hasNextLine()) {
String input = scan.nextLine();
String[] inputArr = input.split(" ");
for(int i = inputArr.length - 1; i >= 0; i--){
System.out.print(inputArr[i] + " ");
}
}
}
}
总结:注意不要使用Scanner
的next()
方法,因为空格会被作为分割符。
描述
开发一个坐标计算工具, A表示向左移动,D表示向右移动,W表示向上移动,S表示向下移动。从(0,0)点开始移动,从输入字符串里面读取一些坐标,并将最终输入结果输出到输出文件里面。
输入:
合法坐标为A(或者D或者W或者S) + 数字(两位以内)
坐标之间以;分隔。
非法坐标点需要进行丢弃。如AA10; A1A; % ; YAD; 等。
下面是一个简单的例子 如:
A10;S20;W10;D30;X;A1A;B10A11;;A10;
处理过程:
起点(0,0)
A10 = (-10,0)
S20 = (-10,-20)
W10 = (-10,-10)
D30 = (20,-10)
x = 无效
A1A = 无效
B10A11 = 无效
一个空 不影响
A10 = (10,-10)
结果 (10, -10)
数据范围:每组输入的字符串长度满足 ,坐标保证满足 ,且数字部分仅含正数
注意请处理多组输入输出
输入描述:
一行字符串
输出描述:
最终坐标,以逗号分隔
示例1
输入:
A10;S20;W10;D30;X;A1A;B10A11;;A10;
复制
输出:
10,-10
复制
示例2
输入:
ABC;AKL;DA1;
复制
输出:
0,0
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int[] arr = new int[]{0, 0};
while(scan.hasNext()) {
String inputStr = scan.next();
String[] params = inputStr.split(";");
for (int i = 0; i < params.length; i++) {
if(!params[i].matches("[ADWS][0-9]{1,2}"))
continue;
switch (params[i].charAt(0)) {
case 'A':
arr[0] -= Integer.valueOf(params[i].substring(1));
break;
case 'D':
arr[0] += Integer.valueOf(params[i].substring(1));
break;
case 'W':
arr[1] += Integer.valueOf(params[i].substring(1));
break;
case 'S':
arr[1] -= Integer.valueOf(params[i].substring(1));
break;
}
}
System.out.println( +arr[0] + "," + arr[1] );
}
}
}
总结:这道题考察了正则匹配、字符串与整数转换、switch条件分支。其它知识点则不难。
描述
密码要求:
1.长度超过8位
2.包括大小写字母.数字.其它符号,以上四种至少三种
3.不能有长度大于2的不含公共元素的子串重复 (注:其他符号不含空格或换行)
数据范围:输入的字符串长度满足
本题有多组输入
输入描述:
一组或多组字符串。每组占一行
输出描述:
如果符合要求输出:OK,否则输出NG
示例1
输入:
021Abc9000
021Abc9Abc1
021ABC9000
021$bc9000
复制
输出:
OK
NG
NG
OK
import java.util.*;
import java.util.regex.Pattern;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while (scanner.hasNext()) {
String input = scanner.next();
if(input.length() <= 8 || !getMatch(input) || containsRepeat(input,0, 3)) {
System.out.println("NG");
} else {
System.out.println("OK");
}
}
}
// 是否长度大于2的子串,即只要包含长度大于3的子串则返回true
private static boolean containsRepeat(String input, int start, int end) {
if(end > input.length()) {
return false;
}
if (input.substring(end).contains(input.substring(start, end))){
return true;
}
return containsRepeat(input, start +1, end+1);
}
private static boolean getMatch(String input) {
int count = 0;
Pattern pattern = Pattern.compile("[A-Z]");
if(pattern.matcher(input).find()){
count++;
}
Pattern pattern2 = Pattern.compile("[a-z]");
if(pattern2.matcher(input).find()){
count++;
}
Pattern pattern3 = Pattern.compile("[0-9]");
if(pattern3.matcher(input).find()){
count++;
}
Pattern pattern4 = Pattern.compile("[^a-zA-Z0-9]");
if(pattern4.matcher(input).find()){
count++;
}
return count >= 3 ? true : false;
}
}
总结:这是一道比较综合的题目,考察了字符串的正则匹配,递归算法等。
import java.util.Scanner;
public class Demo5 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while (scanner.hasNext()) {
String input = scanner.next();
String[] inputArr = input.split("\\.");
System.out.println((Long.parseLong(inputArr[0])<<24) + (Long.parseLong(inputArr[1])<<16) +
(Long.parseLong(inputArr[2])<<8) + (Long.parseLong(inputArr[3]))) ;
}
}
}
总结:这道题用移位运算符特别简单,帮助我们巩固了移位运算的知识点。
(未完待续)