LZ最近翻了翻JAVA版的数据结构与算法,无聊之下将书中的课后题一一给做了一遍,在此给出书中课后题的答案(非标准答案,是LZ的答案,猿友们可以贡献出自己更快的算法)。

1、编写一个程序解决选择问题。令k=N/2,画出表格显示程序对于N种不同的值的运行时间。

分析:选择问题是指从N个数当中,按升序(降序也可以)排列,找出第k个数。LZ的写法是采用书中给出的算法自己实现的,分别采用冒泡排序和分批处理的方式。以下为LZ写出的算法代码。

import java.util.Arrays;
import java.util.Random; //选择问题答案
public class Select { public static final Random RANDOM = new Random(47); //假设N = 10
public static void main(String[] args) {
for (int i = 0; i < 10; i++) {
printResult(createArray(RANDOM.nextInt(100000)));
}
} //冒泡排序
public static void sort(int[] values){
for (int i = 1; i < values.length; i++) {
for (int j = 0; j < values.length - i; j++) {
if (values[j] > values[j + 1]) {
int temp = values[j];
values[j] = values[j + 1];
values[j + 1] = temp;
}
}
}
}
//分批处理
public static int select(int[] values){
if (values == null || values.length == 0) {
throw new NullPointerException("values can't be null.");
}
int k = values.length / 2;
int[] temp = Arrays.copyOf(values, k);
sort(temp);
for (int i = k ; i < values.length; i++) {
if (values[i] < temp[k - 1]) {
temp[k - 1] = temp[k - 2];
for (int j = k - 2; j >0; j--) {
if (values[i] > temp[j]) {
temp[j + 1] = values[i];
break;
}else {
temp[j] = temp[j - 1];
}
}
}
}
return temp[k - 1];
}
//创建随即数组
public static int[] createArray(int length){
int[] values = new int[length];
for (int i = 0; i < length; i++) {
values[i] = RANDOM.nextInt(length * 2);
}
return values;
}
//打印结果
public static void printResult(int[] values){
System.out.println("length:" + values.length);
long start = System.currentTimeMillis();
System.out.println("result:" + select(values));
System.out.println("cost:" + (System.currentTimeMillis() - start) + "ms");
System.out.println("--------------------------------");
} }

2、编写一个程序求解字谜游戏问题。

分析:字谜游戏是从一个二维的字符数组中按照标量寻找单词的过程,LZ写的算法就是最直观的算法,有很多嵌套循环,倘若字符表很大的时候,这种方式会很慢。想必书中的后面章节应该会有更简单的方式,只不过LZ还没看到,以后有机会改善这个算法。

import java.util.Random;

//字谜问题
public class Character { public static final Random RANDOM = new Random(47); public static final String[] WORDS = new String[]{"ynz","yzgm","oqz","owznt","z"}; public static void main(String[] args) {
char[][] chars = createTable(5);
printTable(chars);
findWord(chars);
}
//按照标量方向寻找满足的单词(或者说字符串)
public static void findWord(char[][] chars){
long start = System.currentTimeMillis();
for (int i = 0; i < chars.length; i++) {
for (int j = 0; j < chars.length; j++) {
for (int k = 0; k < chars.length; k++) {
for (int l = 0; l < chars.length; l++) {
if (i == k && j == l) {
printWord(String.valueOf(chars[i][j]), i, j, k, l);
continue;
}
if (k != i && j != l && (k - i) != (j - l) && (k - i) != (l - j)) {
continue;
}
StringBuffer stringBuffer = new StringBuffer();
if (i == k) {
if (j > l) {
for (int m = j; m >= l; m--) {
stringBuffer.append(chars[i][m]);
}
}else {
for (int m = j; m <= l; m++) {
stringBuffer.append(chars[i][m]);
}
}
}
if (j == l) {
if (i > k) {
for (int m = i; m >= k; m--) {
stringBuffer.append(chars[m][j]);
}
}else {
for (int m = i; m <= k; m++) {
stringBuffer.append(chars[m][j]);
}
}
}
if ((k - i) == (j - l)) {
if (i > k) {
for (int m = i,n = j; m >= k && n <= l; m--,n++) {
stringBuffer.append(chars[m][n]);
}
}else {
for (int m = i,n = j; m <= k && n >= l; m++,n--) {
stringBuffer.append(chars[m][n]);
}
}
}
if ((k - i) == (l - j)) {
if (i > k) {
for (int m = i,n = j; m >= k && n >= l; m--,n--) {
stringBuffer.append(chars[m][n]);
}
}else {
for (int m = i,n = j; m <= k && n <= l; m++,n++) {
stringBuffer.append(chars[m][n]);
}
}
}
printWord(stringBuffer.toString(), i, j, k, l);
}
}
}
}
System.out.println("-------------------------------------------------");
System.out.println("cost time:" + (System.currentTimeMillis() - start) + "ms");
}
//判断是否是既定的一个单词(或字符串)并打印
public static void printWord(String word,int i ,int j,int k,int l){
for (int m = 0; m < WORDS.length; m++) {
if (word.equals(WORDS[m])) {
System.out.println("find word:" + WORDS[m]);
System.out.println("scalar:" + "[" + (i+1) + "," + (j+1) + "]->[" + (k+1) + "," + (l+1) + "]");
}
}
}
//创建随即字符二维数组
public static char[][] createTable(int length){
char[][] chars = new char[length][length];
for (int i = 0; i < chars.length; i++) {
for (int j = 0; j < chars[i].length; j++) {
chars[i][j] = (char)(97 + RANDOM.nextInt(26));
}
}
return chars;
}
//打印二维数组
public static void printTable(char[][] chars){
System.out.println("---------------------------------------------");
for (int i = 0; i < chars.length; i++) {
System.out.print("\t" + (i+1));
}
System.out.println();
for (int i = 0; i < chars.length; i++) {
System.out.print((i+1));
for (int j = 0; j < chars.length; j++) {
System.out.print("\t" + chars[i][j]);
}
System.out.println();
}
System.out.println("---------------------------------------------");
} }

结束语

小算怡情,大算伤身。

JAVA算法两道的更多相关文章

  1. 算法(JAVA)----两道小小课后题

    LZ最近翻了翻JAVA版的数据结构与算法,无聊之下将书中的课后题一一给做了一遍,在此给出书中课后题的答案(非标准答案,是LZ的答案,猿友们可以贡献出自己更快的算法). 1.编写一个程序解决选择问题.令 ...

  2. 你所不知道的库存超限做法 服务器一般达到多少qps比较好[转] JAVA格物致知基础篇:你所不知道的返回码 深入了解EntityFramework Core 2.1延迟加载(Lazy Loading) EntityFramework 6.x和EntityFramework Core关系映射中导航属性必须是public? 藏在正则表达式里的陷阱 两道面试题,带你解析Java类加载机制

    你所不知道的库存超限做法 在互联网企业中,限购的做法,多种多样,有的别出心裁,有的因循守旧,但是种种做法皆想达到的目的,无外乎几种,商品卖的完,系统抗的住,库存不超限.虽然短短数语,却有着说不完,道不 ...

  3. Java中两个List对比的算法

    Java中两个List对比的算法:   // 测试数据 // tdcsDdt.add("Z"); // tdcsDdt.add("B"); // tdcsDdt ...

  4. 两道面试题,带你解析Java类加载机制

    文章首发于[博客园-陈树义],点击跳转到原文<两道面试题,带你解析Java类加载机制> 在许多Java面试中,我们经常会看到关于Java类加载机制的考察,例如下面这道题: class Gr ...

  5. 【转】两道面试题,带你解析Java类加载机制(类初始化方法 和 对象初始化方法)

    本文转自 https://www.cnblogs.com/chanshuyi/p/the_java_class_load_mechamism.html 关键语句 我们只知道有一个构造方法,但实际上Ja ...

  6. java 算法之 两个字符串中最大相同的子串

    public class String_intern { public static void main(String[] args) { String old="aaaaabc1" ...

  7. ACM/ICPC 之 Floyd范例两道(POJ2570-POJ2263)

    两道以Floyd算法为解法的范例,第二题如果数据量较大,须采用其他解法 POJ2570-Fiber Network //经典的传递闭包问题,由于只有26个公司可以采用二进制存储 //Time:141M ...

  8. ACM/ICPC 之 SPFA范例两道(POJ3268-POJ3259)

    两道以SPFA算法求解的最短路问题,比较水,第二题需要掌握如何判断负权值回路. POJ3268-Silver Cow Party //计算正逆最短路径之和的最大值 //Time:32Ms Memory ...

  9. JAVA算法系列 冒泡排序

    java算法系列之排序 手写冒泡 冒泡算是最基础的一个排序算法,简单的可以理解为,每一趟都拿i与i+1进行比较,两个for循环,时间复杂度为 O(n^2),同时本例与选择排序进行了比较,选择排序又叫直 ...

随机推荐

  1. PowerDesigner设置

    sql语句中表名与字段名前的引号去除: 打开cdm的情况下,进入Tools-Model Options-Naming Convention,把Name和Code的标签的Charcter case选项设 ...

  2. python test0729.py

    #!/usr/env python #-*- coding: utf-8 -*- import urllib import urllib2 import random import requests ...

  3. cralwer_爬虫代理中心的简要设计

    代理中心: 简单讲: 精细化控制限制资源的使用,保证有限资源的充分利用及有效性.支持动态增减,实时更新. 需求 rest api提供请求输入与输出 客户端使用代理心跳接收,用于更新代理的使用次数,被占 ...

  4. java:高速排序算法与冒泡排序算法

     Java:高速排序算法与冒泡算法 首先看下,冒泡排序算法与高速排序算法的效率: 例如以下的是main方法: /**   *  * @Description:  * @author:cuiyaon ...

  5. 从头开始学JavaScript (八)——变量

    原文:从头开始学JavaScript (八)--变量 一.变量分类: 基本类型值:null.undefined.number.string.Boolean: 引用类型值:保存在内存中的对象,如:Obj ...

  6. Fluent Validation + NInject3 + MVC5

    Fluent Validation + NInject + MVC - Why & How : Part 1 http://fluentvalidation.codeplex.com/ htt ...

  7. PLSQL_监控有些SQL的执行次数和频率

    原文:PLSQL_监控有些SQL的执行次数和频率 2014-12-25 Created By 鲍新建

  8. CSS知识总结之浏览器(持续更新)

    web页面浏览器渲染过程 1.解析html文件,并构建DOM树: 在DOM树中,每一个html标签都有一个对应的节点,并且每一个文本也有一个对应 的节点(js的textNode),DOM树的根节点就是 ...

  9. WebApi 插件式构建方案

    WebApi 插件式构建方案 WebApi 插件式构建方案 公司要推行服务化,不可能都整合在一个解决方案内,因而想到了插件式的构建方案.最终定型选择基于 WebApi 构建服务化,之所以不使用 WCF ...

  10. Microsoft .NET Pet Shop 简介

    最初研究 .NET Pet Shop 的目的是用 Microsoft .NET 实现 Sun 主要的 J2EE 蓝图应用程序 Sun Java Pet Store 同样的应用程序功能. 根据用 .NE ...