计算机算法设计与分析(王晓东著)第一章算法实现题解
Posted nuist__NJUPT
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了计算机算法设计与分析(王晓东著)第一章算法实现题解相关的知识,希望对你有一定的参考价值。
计算机算法设计与分析(王晓东著)第一章算法实现题解
思想:借助辅助数组num去统计0-9出现的次数即可。
case1:直接在控制台输入输出。
import java.util.Arrays;
import java.util.Scanner;
public class CountNumber {
public static void countNumber(int n, int [] num){
Arrays.fill(num, 0) ;
for(int i=1; i<=n; i++){
String s = String.valueOf(i) ;
for(int j=0; j<s.length(); j++){
num[s.charAt(j) - '0'] ++ ;
}
}
for(int i=0; i<num.length; i++){
System.out.println(num[i]) ;
}
}
public static void main(String[] args) {
Scanner input = new Scanner(System.in) ;
int n = input.nextInt() ;
int [] num = new int [10] ;
countNumber(n, num) ;
}
}
case2: 通过读取input.txt文件的测试数据,测试结果输出到output.txt文件。
在D盘的study文件夹下创建input.txt文件和output.txt文件,并在input.txt文件中输入测试数据,运行程序,结果将在output.txt文件输出。
import java.io.*;
import java.util.Arrays;
public class CountNumber {
public static String line ;
public static int [] countNumber(int n, int [] num){
Arrays.fill(num, 0) ;
for(int i=1; i<=n; i++){
String s = String.valueOf(i) ;
for(int j=0; j<s.length(); j++){
num[s.charAt(j) - '0'] ++ ;
}
}
return num ;
}
public static void main(String[] args) {
int[] num = new int[10];
try (FileInputStream input = new FileInputStream("D:\\\\study\\\\input.txt");
DataInputStream dataInputStream = new DataInputStream(new BufferedInputStream(input))){
line = dataInputStream.readLine() ;
} catch (FileNotFoundException ex) {
ex.printStackTrace();
} catch (IOException ex) {
ex.printStackTrace();
}
System.out.println("文件读取成功!!!");
try ( FileOutputStream output = new FileOutputStream("D:\\\\study\\\\output.txt");
DataOutputStream dataOutputStream = new DataOutputStream(new BufferedOutputStream(output))){
int [] res = countNumber(Integer.parseInt(line), num) ;
for(int i=0; i<res.length; i++) {
dataOutputStream.writeBytes(res[i] + "\\n");
}
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("文件写入成功!!!");
}
}
import java.util.Scanner;
public class Lexicographic1 {
//第i位字符开头,长度为k的升序序列个数
public static int f(int i, int k){
int sum = 0 ;
if(k == 1){
return 1 ;
}else{
sum += f(i, k-1) ;
}
return sum ;
}
//字符串长度为k的所有长度的总个数
public static int g(int k){
int sum = 0 ;
for(int i=1; i<=26; i++){
sum += f(i,k) ;
}
return sum ;
}
public static int getResult(String s){
int len = s.length() ;
int sum = 0 ;
for(int i=1; i<len; i++){ //长度小于len位的各个位的升序序列的总和
sum += g(i) ;
}
char [] c = s.toCharArray() ;
int head = c[0] - 'a' + 1 ;
for(int i=1; i<head; i++){ //长度等于len位的以head之前的字母打头的序列总和
sum += f(i, len) ;
}
//计算以head打头的剩下字符,长度等于len位的到字符串s之前的序列总和
for (int i = 1,temp = head; i < len; i++) {
int str2 = c[i]-'a'+1;
int len2 = len-i;
for (int j = temp+1; j < str2; j++) {
sum+=f(j,len2);
}
temp=str2;
}
return sum + 1 ;
}
public static void main(String[] args) {
Scanner input = new Scanner(System.in) ;
int n = input.nextInt() ;
String [] num = new String [n] ;
for(int i=0; i<num.length; i++){
num[i] = input.next() ;
}
for(int j=0; j<n; j++) {
System.out.println(getResult(num[j]));
}
}
}
case1:直接在控制台输入输出。
import java.util.Scanner;
public class Approximate {
public static int count(int n){
int sum = 0 ;
for(int i=1; i<=n; i++){
if(n % i == 0){
sum ++ ;
}
}
return sum ;
}
public static int findNumber(int a, int b){
int max = 0 ;
for(int i=a; i<=b; i++){
max = Math.max(max, count(i)) ;
}
return max ;
}
public static void main(String[] args) {
Scanner input = new Scanner(System.in) ;
int a = input.nextInt() ;
int b = input.nextInt() ;
System.out.println(findNumber(a, b));
}
}
case 2:通过读取input.txt文件的测试数据,测试结果输出到output.txt文件。
在D盘的study文件夹下创建input.txt文件和output.txt文件,并在input.txt文件中输入测试数据,运行程序,结果将在output.txt文件输出。
import java.io.*;
public class Approximate2 {
public static String line = "" ;
public static String [] num ;
public static int count(int n){
int sum = 0 ;
for(int i=1; i<=n; i++){
if(n % i == 0){
sum ++ ;
}
}
return sum ;
}
public static int findNumber(int a, int b){
int max = 0 ;
for(int i=a; i<=b; i++){
max = Math.max(max, count(i)) ;
}
return max ;
}
public static void main(String[] args) {
try (FileInputStream input = new FileInputStream("D:\\\\study\\\\input.txt");
DataInputStream dataInputStream = new DataInputStream(new BufferedInputStream(input))){
line = dataInputStream.readLine() ;
num = line.split("[ ]") ;
} catch (FileNotFoundException ex) {
ex.printStackTrace();
} catch (IOException ex) {
ex.printStackTrace();
}
System.out.println("文件读取成功!!!");
try ( FileOutputStream output = new FileOutputStream("D:\\\\study\\\\output.txt");
DataOutputStream dataOutputStream = new DataOutputStream(new BufferedOutputStream(output))){
int res = findNumber(Integer.parseInt(num[0]), Integer.parseInt(num[1])) ;
dataOutputStream.writeBytes(res + "\\n");
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("文件写入成功!!!");
}
}
case1:控制台输入输出。
import java.util.Scanner;
public class Main {
public static int count = 0 ;
public static boolean flag ;
public static void swap(int [][] arr1, int c1, int c2){ //交换矩阵的两列
for(int i=0; i<arr1.length; i++){
int temp = arr1[i][c1] ;
arr1[i][c1] = arr1[i][c2] ;
arr1[i][c2] = temp ;
}
if(c1 != c2){
count ++ ;
}
}
public static boolean sameColumn(int [][] arr1, int [][] arr2, int c1, int c2){ //判断两个矩阵两列元素是否完全相同
for(int i=0; i<arr1.length; i++){
if(arr1[i][c1] != arr2[i][c2]){
return false ;
}
}
return true ;
}
public static void reverseRow(int [][] arr1, int row){ //将矩阵的某行翻转
for(int i=0; i<arr1[0].length; i++){
arr1[row][i] = arr1[row][i] ^ 1 ;
}
count ++ ;
}
public static void copy(int [][] arr1, int [][] arr2, int m ,int n){ //复制矩阵
for(int i=0; i<m; i++){
for(int j=0; j<n; j++){
arr1[i][j] = arr2[i][j] ;
}
}
}
public static int find(int [][] arr1, int [][] arr2, int m, int n){
int [][] temp = new int [m][n] ;
int min = m + n + 1 ;
copy(temp, arr1, m, n) ;
for(int i=0; i<n; i++){ //每一列作为第一列
swap(arr1, i, 0) ;
for(int j=0; j<m; j++){
if(arr1[j][0] != arr2[j][0]){
reverseRow(arr1, j);
}
}
for(int j=0; j<n; j++){
flag = false ;
for(int k=j; k<n; k+以上是关于计算机算法设计与分析(王晓东著)第一章算法实现题解的主要内容,如果未能解决你的问题,请参考以下文章