1.文章编辑
问题描述:
输入一页文字,可以统计出文字、数字、空格的个数。
基本要求:
⑴静态存储一页文章,每行最多不超过80个字符,共N行。
⑵分别统计出其中英文字母和空格数及整篇文章总字数。
⑶统计某一字符串在文章中出现的次数,并输出该次数。
⑶删除某一子串,并将后面的字符前移。
⑷存储结构使用线性表,分别用几个子函数实现相应的功能。
代码:
import java.util.Scanner;
public class Test1 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入要输入的行数:");
int hs = sc.nextInt();
sc.nextLine();
System.out.println("请输入文章:");
String[] ch = new String[hs];
for (int i = 0; i < hs; i++) {
ch[i] = sc.nextLine();
if (ch[i].length() > 80) {
System.out.println("每行最多不可超过80个字符,请重新输入");
i--;
}
}
int szCount = 0;//数字的个数
int zmCount = 0;//字母的个数
int kgCount = 0;//空格的个数
int OtherCount = 0;//其他字符的个数
for (int i = 0; i < hs; i++) {
//char b[]=ch[j].toCharArray();//将字符串转换成一个新的字符数组
for (int j = 0; j < ch[i].length(); j++) {
if (ch[i].charAt(j) >= '0' && ch[i].charAt(j) <= '9') {
szCount++;
} else if (ch[i].charAt(j) >= 'a' && ch[i].charAt(j) <= 'z' || ch[i].charAt(j) >= 'A' && ch[i].charAt(j) <= 'Z') {
zmCount++;
} else if (ch[i].charAt(j) == ' ') {
kgCount++;
} else {
OtherCount++;
}
}
}
int sum = zmCount + szCount + kgCount + OtherCount;
System.out.println("总字符数为:" + sum);
System.out.println("字符串中含有英文字符数为:" + zmCount);
System.out.println("字符串中含有数字数目为:" + szCount);
System.out.println("字符串中含有空格数目为:" + kgCount);
System.out.println("字符串中含有其他字符数目为:" + OtherCount);
boolean b = true;
while (b) {
System.out.println();
System.out.println("请输入数字选择功能:");
System.out.println("(1)统计某一字符串在文章中出现的次数");
System.out.println("(2)删除某一子串");
System.out.println("(3)查看文章");
switch (sc.nextInt()) {
case 1: {
System.out.println("请输入要统计的字符串:");
sc.nextLine();
String str = sc.nextLine();
System.out.println("字符" + str + "在文章中共出现次数为:" + count(str, ch));
break;
}
case 2: {
System.out.println("请输入要删除的字符串:");
sc.nextLine();
String str = sc.nextLine();
System.out.println(count(str, ch) + "条数据已删除");
delete(str, ch);
break;
}
case 3: {
print(ch);
break;
}
case 0: {
b = false;
break;
}
}
}
}
public static int count(String s, String[] ch) {
int count = 0;
for (String value : ch) {
while (value.contains(s)) {
value = value.substring(value.indexOf(s) + s.length());
++count;
}
}
return count;
}
public static void delete(String s, String[] ch) {
int i = 0;
for (String value : ch) {
while (value.contains(s)) {
value = value.replace(s, "");
ch[i] = value;
}
// while (value.contains(s)) {
// char[] c = value.toCharArray();
// for (int i = value.indexOf(s);i<value.length()-1; i++) {
// c[i] = c[i+ ch.length];
// ch[j] = Arrays.toString(c);
// j++
// }
// }
i++;
}
}
public static void print(String[] ch) {
for (String value : ch) {
System.out.println(value);
}
}
}
运行截图:
2.约瑟夫环
问题描述:
编号为1,2… n的n个人按顺时针方向围坐一圈,每人持有一个密码(正整数)。一开始任选一个正整数作为报数的上限值m,从第一个人开始按顺时针方向自1开始顺序报数,报到m时停止报数,报m的人出列,将他的密码作为新的m值,从他的顺时针方向上的下一个开始重新从1报数,如此下去,直至所有人全部出列为止,设计一个程序求出出列顺序。
基本要求:
⑴利用单循环链表作为存储结构模拟此过程;
⑵键盘输入总人数、初始报数上限值m及各人密码;
⑶按照出列顺序输出各人的编号。
代码:
import java.util.Scanner;
class Linklist {
public class Node { //节点
public int password; //密码
public int number; //顺序
public Node next; //指针
public Node(int password, int number) {
this.password = password;
this.number = number;
}
}//节点
private Node head; //头结点
public Linklist() //构造方法
{
this.head = null;
}
//尾插法
public void addLast(int n){
int i;
Scanner scanner = new Scanner(System.in);
for(i=0;i<n;i++)
{
int password = scanner.nextInt();
int number = i+1;
Node node = new Node(password,number);
if(this.head == null){
this.head = node;
}else {
Node cur = this.head;
while(cur.next != null){
cur = cur.next;
}
cur.next = node;
}
if(i==n-1)
{
node.next = this.head;//尾结点指向头节点
}
}
scanner.close();
}
public void Ring(int M,int N)
{
Node Ring = this.head;
int i,j,temp=M;
for (j = 0; j < N; j++)
{
for (i = 1; i < temp-1; i++)
{
Ring = Ring.next;
}
if (temp == 1)
{
System.out.print(Ring.number+"\t");
Ring = Ring.next;
}
else
{
System.out.print(Ring.next.number+"\t"); //找到要删除的节点的前一个节点
temp = Ring.next.password; //也可以不删除节点
Node p = Ring.next;
Ring.next = p.next;
Ring = Ring.next;
}
}
}
}
public class Test2 {
public static void main(String[]args)
{
Scanner scanner = new Scanner(System.in);
System.out.println("请输入报数的上限:");
int m = scanner.nextInt();
System.out.println("请输入报数人数:");
int n = scanner.nextInt();
System.out.println("请依次输入密码");
Linklist list = new Linklist();
list.addLast(n);
list.Ring(m,n);
}
}
运行截图:
3.八皇后问题
代码:
import java.util.Arrays;
public class Test3 {
int max = 8; //皇后数量
int[] array = new int[max];
int count = 0;
public static void main(String[] args) {
Test3 test = new Test3();
test.push(0);
System.out.println("共有"+test.count+"种摆法");
}
public void push(int n) {
if (n == max) {
count++;
System.out.println(Arrays.toString(array));
return;
}
for (int i = 0; i < 8; i++) {
array[n] = i;
if (examine(n)) {
push(n + 1);
}
}
}
public boolean examine(int n) {
for (int i = 0; i < n; i++) {
if (array[i] == array[n] || Math.abs(n - i) == Math.abs(array[i] - array[n])) {
//再同一列或同一条斜线上
return false;
}
}
return true;
}
}
运行截图:
4. 简单目录管理系统的设计与实现
基本要求:
利用树型结构设计并实现一个简单的目录管理系统,该系统可以对所有目录进行管理,如目录的新建、删除、查询、目录名称修改、按某种顺序输出所有目录(树的遍历操作)、以树型结构输出所有目录等功能。
代码:
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.Scanner;
public class Test4 {
int line=0;
String str="";
String word;
int count;
public void newFile() throws IOException {
System.out.println("请输入文件地址:");
Scanner scanner=new Scanner(System.in);
String path =scanner.next();
File file = new File(path);
if(!file.exists()){
file.getParentFile().mkdirs();
}
file.createNewFile();
FileReader fr = new FileReader(file);
BufferedReader br = new BufferedReader(fr);
System.out.println("请输入要查询的单词:");
word=scanner.next();
char[]w=word.toCharArray();
while((str=br.readLine())!=null) {
line++;
char[]st=str.toCharArray();
if(KMP(st,w)==true) { //查询单词位置,true表示该单词出现在这一行
System.out.println("在第" + line + "行");
}
}
br.close();
fr.close();
}
public boolean KMP(char[] str,char[] ptr){//KMP方法查找单词
//计算模式子串的next数组
int[] next=cal_next(ptr);
boolean flag=false;
int slen=str.length;
int plen=ptr.length;//子串的长度
int num=0;//存放查询单词位置
int j=-1;
for(int i=0;i<slen;i++){
while(j>-1&&ptr[j+1]!=str[i]){
j=next[j];
}
if(ptr[j+1]==str[i]){
j=j+1;
}
if(Character.isSpaceChar(str[i])){
num++;//词数位置+1
}
if(j==(plen-1)){
j=0;
count++;
System.out.println("该单词第"+count+"次"+"出现的位置在第"+(num+1)+"个单词");//存在则输出位置
flag= true;
}
}
return flag;
}
public int[] cal_next(char[] s) {
int len = s.length;
int[] next = new int[len];
next[0] = -1;
int k = -1;//k表示s[0,k]字符串的最长前缀等于最长后缀时的最长前缀长度减去1
//遍历长度为n的子串,时间复杂度O(n)
for (int q = 1; q <= (len - 1); q++) {
//如果下一个不同,那么k就变成next[k],注意next[k]是小于k的,无论k取任何值。
while (k > -1 && s[k + 1] != s[q]) {
k = next[k];//往前回溯
}
if (s[k + 1] == s[q]) {
k = k + 1;
}
//这个是把算的k的值(就是相同的最大前缀或最大后缀的长度减去1)赋给next[q]
next[q] = k;
}
return next;
}
public void start() throws IOException {
newFile();
if(count>0) {
System.out.println("该单词总共出现了" + count + "次");
}else{
System.out.println("该单词在文中不存在!");
}
}
public static void main(String[] args) throws IOException {
Test4 f=new Test4();
f.start();
}
}
运行截图: