算法第四版

  向上开发,向下成长,从算法习题开始

1.1.1 给出以下表达式的值:
         a. ( 0 + 15 ) / 2                           //整数的除法
         b. 2.0e-6 * 100000000.1          //拆开来看0.0000002*100000000.1,原先我理解是化零结果是200.2,数学老师,您辛苦了。
         c. true && false || true && true  //正确

1.1.2 给出以下表达式的类型和值:
        a. (1 + 2.236)/2                   //支持口算,1.618

        b. 1 + 2 + 3 + 4.0                //10.0

        c. 4.1 >= 4                          //真

        d. 1 + 2 + "3"                      //字符串拼接  “123”

1.1.3 编写一个程序,从命令行得到三个整数参数。如果它们都相等则打印 equal,否则打印 not equal。

	Scanner scan=new Scanner(System.in);
		int num = scan.nextInt();
		int num2 = scan.nextInt();
		int num3 = scan.nextInt();
		if(num==num2){
			if(num==num3){
				System.out.println("equal");
			}
		}else{
			System.out.println("not equal");
	}

上面还有第二种写法

1.1.4下列语句各有什么问题(如果有的话)?
a. if (a > b) then c = 0;             //java没有then
b. if a > b { c = 0; }                    //少了括号
c. if (a > b) c = 0;                    //不带花括号是危险的
d. if (a > b) c = 0 else b = 0;     //别以为你藏的这么深我就看不到

1.1.5     编写一段程序,如果 double 类型的变量 x 和 y 都严格位于 0 和 1 之间则打印 true,否则打印 false

这道题,原本我以为是要无限求小,结果我发现,其实只要判断一个数是否在这个区间if(a>=0&&a<=1),此处埋下伏笔

1.1.6下面这段程序会打印出什么?

    int f = 0;

     int g = 1;

   for (int i = 0; i <= 15; i++)

   {

          StdOut.println(f);

          f = f + g;

          g = f - g;

    }

好多零,像我的存款一样,作者不会轻易暴露存款的。

1.1.7 分别给出以下代码段打印出的值
  a

  double t = 9.0;

  while (Math.abs(t - 9.0/t) > .001)

   t = (9.0/t + t) / 2.0;

  StdOut.printf("%.5f\n", t);     

//数学问题

b.

int sum = 0;
for (int i = 1; i < 1000; i++)
   for (int j = 0; j < i; j++)
        sum++;
      StdOut.println(sum);

高斯王子:1+2+3+4+……999=?

c.

int sum = 0;
    for (int i = 1; i < 1000; i *= 2)
        for (int j = 0; j < 1000; j++)
        sum++;
       StdOut.println(sum);
     分析:等比数列2的求和:1000

1.1.8 下列语句会打印出什么结果? 给出解释。
       a. System.out.println('b');                //输出b
       b. System.out.println('b' + 'c');        //字符相加,类型自动转换,求解结果为ASCII表值
        c. System.out.println((char) ('a' + 4));  //强制类型转换

1.1.9 为书中给的另一种把整数型转化成二进制的方法

         int N=4;
        String s = "";
        for (int n = N; n > 0; n /= 2)
             s = (n % 2) + s;
 

//书上源码,自己推敲下,能想的出来,主要还是十进制转二进制要熟练

题外话:至于书上提到的Integer中的源码,我也大概看了下,理解了一下思路,先来说说我的理解

      final static char[] digits = {
            '0' , '1' , '2' , '3' , '4' , '5' ,
            '6' , '7' , '8' , '9' , 'a' , 'b' ,
            'c' , 'd' , 'e' , 'f' , 'g' , 'h' ,
            'i' , 'j' , 'k' , 'l' , 'm' , 'n' ,
            'o' , 'p' , 'q' , 'r' , 's' , 't' ,
            'u' , 'v' , 'w' , 'x' , 'y' , 'z'
        };//Integer中定义的一个可能字符列表,相当于一个映射表,屏幕数字对应的映射表

public static String toBinaryString(int i) {
        return ToBinary.toUnsignedString(i, 1);   //这里是使用一个通用函数,我觉得1表示进制,因为涉及到移位
    }

private static String toUnsignedString(int i, int shift) {    //数字转化为无符号字符串,意味着最高位不代表正负
        char[] buf = new char[32];       //存储转换后的二进制数
        int charPos = 32;                    //记录位置,为后面的字符窜构造函数定位
        int radix = 1 << shift;               //radix为根的意思,这个值为进制数左移移位得到,假设待转化的数为4,则这里会得到2
        int mask = radix - 1;               //mask英文为面具,这时候那个定义的对照数组起作用了,为什么减一,我觉得是因为数组起始索引为1,(补充:与2的n次幂减1的与可以得到余数)
        do {
            buf[--charPos] = digits[i & mask];    //i与mask同或,相当于i除以进制,此时得到第一个得到的位
            i >>>= shift;                                      //>>> :将i右移shift位,这里是1,如果是转二进制再则待转换数再除二
        } while (i != 0);

        return new String(buf, charPos, (32 - charPos));       //字符串构造函数
    }

1.1.11编写一段代码, 打印出一个二维布尔数组的内容。 其中, 使用 * 表示真, 空格表示假。 打印出
行号和列号。

分析:这个题目要解决在保证数组不越界的情况下,打印出行号和列号,我想的是最简单的情况

    for(int i=0;i<test.length;i++){
            for(int j=0;j<test[i].length;j++)
            {
                if(test[i][j]){
                    System.out.print("*");
                }else{
                    System.out.print(" ");
                }
            }
            System.out.println();
        }

还有复杂版,这个不是我做的,是别人做出来我看效果的,很巧妙(利用 数组规避了访问溢出的问题),很多时候自己想不出来,看别人代码就恍然大悟这种感觉不好,我觉得需要自己写出来的才有成就感,做的失败。

1.1.12 以下代码段会打印出什么结果?
int[] a = new int[10];
for (int i = 0; i < 10; i++)
a[i] = 9 - i;
for (int i = 0; i < 10; i++)
a[i] = a[a[i]];
for (int i = 0; i < 10; i++)
System.out.println(i);
  //打印0-9

1.1.13 编写一段代码, 打印出一个 M 行 N 列的二维数组的转置(交换行和列) 。

    这个简单,遍历交换,是不是连二维数组都不会创建了。。。

1.1.14 编写一个静态方法 lg(), 接受一个整型参数 N, 返回不大于 log2N 的最大整数。 不要使用 Math 库。

    涉及到数学问题,这个不太懂,暂且放着

1.1.15 编写一个静态方法 histogram(), 接受一个整型数组 a[] 和一个整数 M 为参数并返回一个大小为M的数组,其中第 i个元素的值为整数i在参数数组中出现的次数。如果 a[]中的值均在 0到M-1之间, 返回数组中所有元素之和应该和 a.length 相等。
    public static int[] histogram(int[] a,int m){
        int[] result=new int[m];
        for (int i = 0; i < result.length; i++) {
            for (int j = 0; j < a.length; j++) {
                if(a[j]==i){
                    result[i]+=1;
                }
            }
        }
        return result;
    }                 //写完后没检查,自我感觉良好

1.1.16,1.1.17略

1.1.18

给定正整数 a 和 b, mystery(a,b)
计算的结果是什么?如果是+,公式是没想出来

1.1.19 最经典的斐波那契数列,貌似食堂的汤就是这种

long []result=new long[100];
        for (int i = 0; i < result.length; i++) {
            if(i==0){
                result[i]=0;
            }else if(i==1){
                result[i]=1;
            }else{
                result[i]=result[i-1]+result[i-2];
            }
            System.out.println(i+" "+result[i]);
        }*

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值