前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >java算法刷题01——字符串、数组、集合、基本数据类型

java算法刷题01——字符串、数组、集合、基本数据类型

作者头像
用户10127530
发布2022-10-26 17:32:05
9300
发布2022-10-26 17:32:05
举报
文章被收录于专栏:半旧的技术栈半旧的技术栈

字符串、集合、数组、基本数据类型是java里最基础的知识点,但也是频频被使用的,在算法题里属于高频基础题,下面结合一些题目来学习这些知识点。

T1.字符串分隔

描述

•连续输入字符串,请按长度为8拆分每个输入字符串并进行输出; •长度不是8整数倍的字符串请在后面补数字0,空字符串不处理。 (注:本题有多组输入) 输入描述:

连续输入字符串(输入多次,每个字符串长度小于等于100) 输出描述:

依次输出所有分割后的长度为8的新字符串 示例1 输入:

abc 123456789

输出:

abc00000 12345678 90000000 解法1:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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循环。

T2.句子逆序

描述 将一个英文语句以单词为单位逆序排放。例如“I am a boy”,逆序排放后为“boy a am I” 所有单词之间用一个空格隔开,语句中除了英文字母外,不再包含其他字符

数据范围:输入的字符串长度满足

注意本题有多组输入 输入描述: 输入一个英文语句,每个单词用空格隔开。保证输入只包含空格和字母。

输出描述: 得到逆序的句子

示例1 输入: I am a boy 复制 输出: boy a am I 复制 示例2 输入: nowcoder 复制 输出: nowcoder

代码语言:javascript
复制
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] + " ");
           }
           
        }
       
    }
}

总结:注意不要使用Scannernext()方法,因为空格会被作为分割符。

*T3.坐标移动

描述 开发一个坐标计算工具, 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

代码语言:javascript
复制
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条件分支。其它知识点则不难。

*T4. 检验密码是否合格

描述 密码要求:

1.长度超过8位

2.包括大小写字母.数字.其它符号,以上四种至少三种

3.不能有长度大于2的不含公共元素的子串重复 (注:其他符号不含空格或换行)

数据范围:输入的字符串长度满足

本题有多组输入 输入描述: 一组或多组字符串。每组占一行

输出描述: 如果符合要求输出:OK,否则输出NG

示例1 输入: 021Abc9000 021Abc9Abc1 021ABC9000 021$bc9000 复制 输出: OK NG NG OK

代码语言:javascript
复制
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;
    }      
}

总结:这是一道比较综合的题目,考察了字符串的正则匹配,递归算法等。

T5.IP地址转整数
代码语言:javascript
复制
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]))) ;
        }
    }


}

总结:这道题用移位运算符特别简单,帮助我们巩固了移位运算的知识点。

(未完待续)

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-12-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • T1.字符串分隔
  • T2.句子逆序
  • *T3.坐标移动
  • *T4. 检验密码是否合格
  • T5.IP地址转整数
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档