是
否
是
否
是
否
是
否
獲取字符串
字符數組
大寫?
小寫?
數字?
非字母與數字
大寫字母
小寫字母
數字
i
結束
i=i+1
第一步 拆分字符串為字符數組:
static void count(String str) {
// 將字符串拆分為字符數組
char[] charArray = str.toCharArray();
}
第二步 定義相關變量記錄結果:
// 記錄數字字符串
String digit = "";
// 記錄統計數字出現的次數
int digitCount = 0;
// 記錄大寫字母字符串
String upper = "";
// 記錄大寫字母出現的次數
int upperCount = 0;
// 記錄小寫字母字符串
String lower = "";
// 記錄小寫字母出現的次數
int lowerCount = 0;
// 記錄非字母與數字的字符串
String other = "";
// 記錄非字母與數字出現的次數
int otherCount = 0;
第三步 遍歷字符數組,依次判斷:
// 遍歷字符數組依次判斷字符類型
for (char ch : charArray) {
// 統計大寫字母
if (Character.isUpperCase(ch)) {
upperCount++;
// 字符轉字符串
upper += Character.toString(ch);
}
// 統計小寫字母
if (Character.isLowerCase(ch)) {
lowerCount++;
lower += Character.toString(ch);
}
// 統計數字
if (Character.isDigit(ch)) {
digitCount++;
digit += Character.toString(ch);
}
// 統計非字母或數字
if (!Character.isLetterOrDigit(ch)) {
otherCount++;
other += Character.toString(ch);
}
}
完整代碼:
package task03.code0301;
public class CountChar {
public static void main(String[] args) {
String str = "ABCD123!@#$%ab";
count(str);
}
static void count(String str) {
char[] charArray = str.toCharArray();
String digit = "";
int digitCount = 0;
String upper = "";
int upperCount = 0;
String lower = "";
int lowerCount = 0;
String other = "";
int otherCount = 0;
for (char ch : charArray) {
if (Character.isUpperCase(ch)) {
upperCount++;
upper += Character.toString(ch);
}
if (Character.isLowerCase(ch)) {
lowerCount++;
lower += Character.toString(ch);
}
if (Character.isDigit(ch)) {
digitCount++;
digit += Character.toString(ch);
}
if (!Character.isLetterOrDigit(ch)) {
otherCount++;
other += Character.toString(ch);
}
}
System.out.printf("大寫字母%d個:\"%s\";\n小寫字母%d個:\"%s\";\n數字%d個:\"%s\";\n其他字符%d個:\"%s\"。\n", upperCount, upper,
lowerCount, lower, digitCount, digit, otherCount, other);
}
}
// 大寫字母4個:"ABCD";
// 小寫字母2個:"ab";
// 數字3個:"123";
// 其他字符5個:"!@#$%"。
第二題
如: s1=“asdafghjka”, s2=“aaasdfg” 他們的最大子串為"asd"
提示: 將短的那個串進行長度依次遞減的子串與較長的串比較。
思路:
1、判斷兩個字符串的長度大小;
2、若長的字符串包含短的字符串,則短字符串為兩者最大子串;
3、短的字符串長度依次遞減,觀察長的字符串是否包含,若包含,則此時為兩者的最大子串,以"aaasdfg"為例:
當長度=7時,有1子串——(0,7)“aaasdfg”;因前面做了先行判斷,可跳過;
當長度=6時,有2子串——(0,6)“aaasdf”;(1,7)“aasdfg”;
當長度=5時,有3子串——(0,5)“aaasd”;(1,6)“aasdf”;(2,7)“asdfg”;
當長度=4時,有4子串——(0,4)“aaas”;(1,5)“aasd”;(2,6)“asdf”;(3,7)“sdfg”;
…
3、規律總結:
第一次:i=0,j=0–>(0,7)=(?,?);不確定;
第二次:i=1,j=0–>(0,6)=(j,7-i); i=1,j=1–>(0,6)=(j,7-i+j);確定下標起點為j,猜想終點位置為7-i+j,繼續驗證;
第三次:i=2,j=0–>(0,5)=(j,7-i+j); i=2,j=1–>(1,6)=(j,7-i+j); i=2,j=2–>(2,7)=(j,7-i+j);確定終點位置為7-i+j。
第一步 判斷兩個字符串長度大小:
static String getMaxSonStr(String s1, String s2) {
String maxStr = s1.length() > s2.length() ? s1 : s2;
String minStr = s1.length() > s2.length() ? s2 : s1;
}
第二步 判斷大字符串是否包含小字符串:
// 如果包含,則直接返回
if (maxStr.contains(minStr))
return minStr;
第三步 遞減小字符串長度,依次判斷:
// 初始化最大字符串
String maxSonStr = "";
// 初始化子串
String sonStr = "";
// 遞減字符串長度
outer: for (int i = 1; i < minStr.length(); i++) {
// 獲取同一長度的所有子串
for (int j = 0; j <= i; j++) {
sonStr = minStr.substring(j, minStr.length() - i + j);
// 如果大字符串包含子串,則賦值給最大子串,跳出外層循環
if (maxStr.contains(sonStr)){
maxSonStr=sonStr;
break outer;
}
}
}
// 如果沒有最大子串,返回""
return maxSonStr;
完整代碼:
package task03.code0302;
public class MaxSonStr {
public static void main(String[] args) {
String maxSonStr = getMaxSonStr("asdafghjka", "aaasdfg");
if ("".equals(maxSonStr)) {
System.out.println("沒有最大子串");
} else {
System.out.println("最大子串:" + maxSonStr);
}
}
static String getMaxSonStr(String s1, String s2) {
String maxStr = s1.length() > s2.length() ? s1 : s2;
String minStr = s1.length() > s2.length() ? s2 : s1;
String maxSonStr = "";
String sonStr = "";
if (maxStr.contains(minStr))
return minStr;
outer: for (int i = 1; i < minStr.length(); i++) {
for (int j = 0; j <= i; j++) {
sonStr = minStr.substring(j, minStr.length() - i + j);
if (maxStr.contains(sonStr)) {
maxSonStr = sonStr;
break outer;
}
}
}
return maxSonStr;
}
}
// 最大子串:asd
第三題
準備一個 HashMap 集合,統計字符串"123,456,789,123,456"中每個數字字符串出現的次數并打印出來。
如:
? 123 出現了 2 次
? 456 出現了 2 次
? 789 出現了 1 次
第一步 拆分字符串為字符串數組:
String[] str ="123,456,789,123,456".split(",");
第二步 定義一個HashMap:
// 將字符串作為key;
// value作為計數;
Map strMap = new HashMap<>();
第三步 遍歷字符串數組放入HashMap,如果key重復則value+1覆蓋原有鍵值對:
// 遍歷字符串數組
for (int i =0;i
if (!strMap.containsKey(str[i])) {
// 如果不存在key,則放入當前字符串,并value為1,表示該字符串出現了1次
strMap.put(str[i], 1);
}else{
// 如果已經存在當前字符串,獲取一存在該字符串key的value,加以后覆蓋既有鍵值對,表示該字符串出現了+1次
strMap.put(str[i], strMap.get(str[i])+1);
}
}
完整代碼:
package task03.code0303;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
public class HashMapPractice {
public static void main(String[] args) {
String[] str ="123,456,789,123,456".split(",");
Map strMap = new HashMap<>();
for (int i =0;i
if (!strMap.containsKey(str[i])) {
strMap.put(str[i], 1);
}else{
strMap.put(str[i], strMap.get(str[i])+1);
}
}
// 打印結果
Set keys = strMap.keySet();
for (String key : keys) {
System.out.printf("%s出現了%d次;\n",key,strMap.get(key));
}
}
}
// 123出現了2次;
// 456出現了2次;
// 789出現了1次;
第四題
使用 List 集合實現簡易的學生信息管理系統,要求打印字符界面提示用戶選擇相應的功 能,根據用戶輸入的選擇去實現增加、刪除、修改、查找以及遍歷所有學生信息的功能。
其中學生的信息有:學號、姓名、年齡。 要求: 盡量將功能拆分為多個.java 文件。
前提條件:采用LinkedList
第一步 定義學生類:
package task03.code0304;
import java.util.Objects;
public class Student {
// 學號、姓名、年齡
private String name;
private int id;
private int age;
// 有參構造
Student(int id,String name,int age){
setId(id);
setName(name);
setAge(age);
}
public void setAge(int age) {
this.age = age;
}
public void setId(int id) {
this.id = id;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public int getId() {
return id;
}
public String getName() {
return name;
}
// 用學號作為對象的等價標準
@Override
public boolean equals(Object obj) {
if (this==obj) return true;
if(obj==null||this.getClass()!=obj.getClass())return false;
Student b = (Student)obj;
return id==b.id;
}
// 返回學號的哈希碼
@Override
public int hashCode() {
return Objects.hash(id);
}
// 打印對象輸出格式
@Override
public String toString() {
return "id:" + id + ", name:'" + name + "',age:"+age;
}
}
第二步 增加學生對象功能:
package task03.code0304;
import java.util.List;
public class Add {
/**
* 添加學生對象
*
* @param id 學號
* @param name 姓名
* @param age 年齡
* @param listStudents 存放學生對象的List
*/
public static void addStudent(int id, String name, int age,List listStudents) {
Student newStudent = new Student(id, name, age);
boolean flag = listStudents.contains(newStudent);
if (flag) {
System.out.printf("學號%d已經存在,添加失敗\n", id);
} else {
listStudents.add(newStudent);
System.out.printf("%s添加成功\n", name);
}
}
}
第三步 刪除學生對象功能:
package task03.code0304;
import java.util.List;
public class Delete {
/**
* 通過學號刪除學生對象
*
* @param id 學號
* @param listStudents
*/
public static void deleteStudent(int id, List listStudents) {
// 遍歷學生對象List
for (Student student : listStudents) {
// 獲取當前對象索引
int index = listStudents.indexOf(student);
// 如果當前對象id等于目標id
if (id == student.getId()) {
// 刪除
listStudents.remove(index);
System.out.printf("%d刪除成功\n", student.getId());
}
}
}
}
第四步 查詢學生對象:
package task03.code0304;
import java.util.List;
public class Search {
/**
* 查詢學生對象
*
* @param id 學號
* @param listStudents
* @return 返回學生對象或者null
*/
public static Student seachStudent(int id, List listStudents) {
// 遍歷List,返回目標
for (Student student : listStudents) {
if (id == student.getId()) {
return student;
}
}
// 如果不存在,則返回null
return null;
}
}
第五步 修改學生對象:
package task03.code0304;
public class Change {
/**
* 修改學生對象
*
* @param id 修改后的學號
* @param name 修改后的姓名
* @param age 修改后的年齡
* @param student 修改的對象
*/
public static void changeStudent(int id,String name, int age,Student student) {
student.setId(id);
student.setAge(age);
student.setName(name);
System.out.println("修改成功!");
}
}
第六步 打印所有學生信息:
package task03.code0304;
import java.util.List;
public class Print {
/**
* 打印所有學生對象
*
* @param listStudents
*/
public static void printStudents(List listStudents) {
for (Student student : listStudents) {
System.out.println(student);
}
}
}
第七步 系統主菜單:
package task03.code0304;
import java.util.LinkedList;
import java.util.List;
import java.util.Scanner;
public class Main {
public static void getStart() {
// 定一個存放學生對象的list
List listStudents = new LinkedList<>();
// 獲取輸入
Scanner sc = new Scanner(System.in);
// 用于接收輸入的值
int age;
int id;
String name;
while (true) {
// 打印菜單
System.out.println("1、增加學生信息;\n" + "2、查詢學生信息;\n" + "3、刪除學生信息;\n" + "4、修改學生信息;\n" + "5、打印所有學生;\n" + "0、退出;");
// 獲取輸入的菜單選項
int flag = sc.nextInt();
switch (flag) {
// 增加
case 1:
System.out.println("輸入id");
id = sc.nextInt();
System.out.println("輸入姓名");
name = sc.next();
System.out.println("輸入年齡");
age = sc.nextInt();
Add.addStudent(id, name, age, listStudents);
break;
// 查找
case 2:
System.out.println("輸入id");
id = sc.nextInt();
Student seachStudent = Search.seachStudent(id, listStudents);
if (null == seachStudent) {
System.out.println("無對象");
} else {
System.out.println("搜索成功" + seachStudent);
}
break;
case 3:
System.out.println("輸入需要刪除的id");
id = sc.nextInt();
Delete.deleteStudent(id, listStudents);
break;
// 修改-->先查詢、再修改
case 4:
System.out.println("輸入要修改的id");
id = sc.nextInt();
Student getStudent = Search.seachStudent(id, listStudents);
// 如果查詢結果為null,則退出,否則執行下面的修改操作
if (null == getStudent) {
System.out.println("無對象");
break;
}
System.out.println("輸入id");
id = sc.nextInt();
System.out.println("輸入姓名");
name = sc.next();
System.out.println("輸入年齡");
age = sc.nextInt();
Change.changeStudent(id, name, age, getStudent);
break;
// 打印所有對象
case 5:
System.out.println("print");
Print.printStudents(listStudents);
break;
// 打印退出系統
case 0:
System.out.println("正在退出系統...");
break;
default:
System.out.println("請重新選擇");
break;
}
// 結束循環,退出系統
if (0 == flag)
break;
}
sc.close();
}
}
第八步 測試:
package task03.code0304;
public class MainTest {
public static void main(String[] args) {
Main.getStart();
}
}
// 1、增加學生信息;
// 2、查詢學生信息;
// 3、刪除學生信息;
// 4、修改學生信息;
// 5、打印所有學生;
// 0、退出;
// 1
// 輸入id
// 100
// 輸入姓名
// 張三
// 輸入年齡
// 22
// 張三添加成功
// 1、增加學生信息;
// 2、查詢學生信息;
// 3、刪除學生信息;
// 4、修改學生信息;
// 5、打印所有學生;
// 0、退出;
// 2
// 輸入id
// 100
// 搜索成功id:100, name:'張三',age:22
// 1、增加學生信息;
// 2、查詢學生信息;
// 3、刪除學生信息;
// 4、修改學生信息;
// 5、打印所有學生;
// 0、退出;
// 4
// 輸入要修改的id
// 100
// 輸入id
// 101
// 輸入姓名
// 李四
// 輸入年齡
// 33
// 修改成功!
// 1、增加學生信息;
// 2、查詢學生信息;
// 3、刪除學生信息;
// 4、修改學生信息;
// 5、打印所有學生;
// 0、退出;
// 5
// id:101, name:'李四',age:33
// 1、增加學生信息;
// 2、查詢學生信息;
// 3、刪除學生信息;
// 4、修改學生信息;
// 5、打印所有學生;
// 0、退出;
// 0
// 正在退出系統...
第五題
使用集合實現斗地主游戲的部分功能,要求如下:
(1)首先準備 54 張撲克牌并打亂順序。
(2)由三個玩家交替摸牌,每人 17 張撲克牌,最后三張留作底牌。
(3)查看三個玩家手中的撲克牌和底牌。
(4)其中玩家手中的撲克牌需要按照大小順序打印,規則如下:
手中撲克牌從大到小的擺放順序:大王,小王,2,A,K,Q,J,10,9,8,7,6,5,4,3
第一步 生成撲克牌:
// 按大小順序
String[] value = { "大王", "小王", "2", "A", "K", "Q", "J", "10", "9", "8", "7", "6", "5", "4", "3" };
// 花色
String[] type = { "紅桃", "黑桃", "梅花", "方塊" };
// 存放生成的撲克牌
Map cards = new HashMap<>();
// 1-54的整數list,用于打亂順序取撲克牌,模擬洗牌
List order = new ArrayList<>();
// 初始化撲克牌序號
int index = 1;
// 遍歷牌面值value
for (int i = 0; i < value.length; i++) {
// 遍歷花色type
for (int j = 0; j < type.length; j++) {
// 前兩張大小王沒有花色
if (i < 2) {
// 添加撲克牌序號與牌面
cards.put(index, value[i]);
// 添加序號
order.add(index);
index++;
// 跳出內循環
break;
} else {
// 大小王外,添加序號與花色+牌面
cards.put(index, type[j] + value[i]);
// 添加序號
order.add(index);
index++;
}
}
}
第二步 洗牌:
// 打亂ArrayList順序
Collections.shuffle(order);
第三步 發牌與排序:
// 發牌原理:將order的元素一次分配給其他四個ArrayList對象
// 玩家a
private static List a = new ArrayList<>();
// 玩家b
private static List b = new ArrayList<>();
// 玩家c
private static List c = new ArrayList<>();
// 底牌
private static List x = new ArrayList<>();
// 遍歷order元素
for (int i = 0; i < order.size(); i++) {
// 獲取order元素
int cardId = order.get(i);
// 前三個元素添加進底牌
if(i<3){
x.add(cardId);
}
// a 玩家摸牌
else if (i%3==1) {
a.add(cardId);
}
// b 玩家摸牌
else if(i%3==2){
b.add(cardId);
}
// c 玩家摸牌
else{
c.add(cardId);
}
}
// 元素排序
Collections.sort(a);
Collections.sort(b);
Collections.sort(c);
第四步 顯示真正牌面:
// 遍歷a,從撲克牌中取出牌面
for (Integer integer : a) {
System.out.print(cards.get(integer)+" ");
}
......
完整代碼:
package task03.code0305;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class Landlords {
private static String[] value = { "大王", "小王", "2", "A", "K", "Q", "J", "10", "9", "8", "7", "6", "5", "4", "3" };
private static String[] type = { "紅桃", "黑桃", "梅花", "方塊" };
private static Map cards = new HashMap<>();
private static List order = new ArrayList<>();
private static List a = new ArrayList<>();
private static List b = new ArrayList<>();
private static List c = new ArrayList<>();
private static List x = new ArrayList<>();
public static void getCards() {
int index = 1;
for (int i = 0; i < value.length; i++) {
for (int j = 0; j < type.length; j++) {
if (i < 2) {
cards.put(index, value[i]);
order.add(index);
index++;
break;
} else {
cards.put(index, type[j] + value[i]);
order.add(index);
index++;
}
}
}
}
public static void shuffle(){
Collections.shuffle(order);
}
public static void distribute(){
for (int i = 0; i < order.size(); i++) {
int cardId = order.get(i);
if(i<3){
x.add(cardId);
}
else if (i%3==1) {
a.add(cardId);
}else if(i%3==2){
b.add(cardId);
}else{
c.add(cardId);
}
}
Collections.sort(a);
Collections.sort(b);
Collections.sort(c);
}
public static void showCards(){
System.out.println("a玩家:");
printCards(a);
System.out.println("\nb玩家:");
printCards(b);
System.out.println("\nc玩家:");
printCards(c);
System.out.println("\n底牌:");
printCards(x);
}
private static void printCards(List l){
for (Integer integer : l) {
System.out.print(cards.get(integer)+" ");
}
}
}
測試:
package task03.code0305;
public class LandlordsTest {
public static void main(String[] args) {
// 獲取撲克
Landlords.getCards();
// 洗牌
Landlords.shuffle();
// 發牌
Landlords.distribute();
// 顯示牌
Landlords.showCards();
}
}
// a玩家:
// 梅花2 方塊2 梅花A 方塊K 黑桃Q 方塊Q 梅花J 方塊J 紅桃10 梅花10 紅桃7 紅桃6 方塊6 紅桃5 梅花5 梅花3 方塊3
// b玩家:
// 大王 黑桃2 黑桃A 方塊A 紅桃K 紅桃Q 紅桃J 黑桃9 方塊9 黑桃8 梅花8 黑桃7 梅花7 紅桃4 黑桃4 方塊4 黑桃3
// c玩家:
// 小王 紅桃2 紅桃A 黑桃K 梅花K 梅花Q 黑桃J 黑桃10 紅桃9 梅花9 紅桃8 方塊8 黑桃6 梅花6 黑桃5 梅花4 紅桃3
// 底牌:
// 方塊5 方塊10 方塊7