计算机算法设计与分析(王晓东著)第一章算法实现题解

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+&#

以上是关于计算机算法设计与分析(王晓东著)第一章算法实现题解的主要内容,如果未能解决你的问题,请参考以下文章

算法设计与分析期末抱佛脚复习

电脑学习

算法设计与分析:第一章总结

红书《题目与解读》第一章 数学 题解《ACM国际大学生程序设计竞赛题目与解读》

数学 题解《ACM国际大学生程序设计竞赛题目与解读》

数学 题解《ACM国际大学生程序设计竞赛题目与解读》