楼主: jaly50
跳转到指定楼层
上一主题 下一主题
收起左侧

Berkeley CS 61B Data Structures(in Java) Homework2 加分+讨论帖

 
🔗
zhang123587 2017-4-1 23:37:58 | 只看该作者
全局:
打卡交作业~hw就慢慢有难度了。。算法真是无止境-。-

hw2.PNG (49.86 KB, 下载次数: 1)

hw2.PNG

评分

参与人数 1学分 +1 收起 理由
yingy4 + 1

查看全部评分

回复

使用道具 举报

🔗
lsxzll 2017-4-2 11:02:55 | 只看该作者
全局:
交作业,交作业。一道一道跟下来,更加感到这个课不仅是讲的清楚,课后作业的设置尤其好。总是能骚到痛处。也多谢前面各位的总结和讨论获益良多。大家共勉。


补充内容 (2017-4-3 00:54):
哇哈哈,看到楼下,又回头看了自己的,也是“居然有错”。。。isbefore()少了 this.day=d.day,立马改正,图就不再传了 :)

hw2.jpeg (275.68 KB, 下载次数: 1)

hw2.jpeg

评分

参与人数 1学分 +1 收起 理由
yingy4 + 1

查看全部评分

回复

使用道具 举报

🔗
dengzeyu147 2017-4-2 16:58:18 | 只看该作者
全局:
本帖最后由 dengzeyu147 于 2017-4-2 17:17 编辑

半个月前做的 下午认真一看 居然有错 留在迟点有空再找
警示


评分

参与人数 1学分 +1 收起 理由
yingy4 + 1

查看全部评分

回复

使用道具 举报

🔗
spirit660640 2017-4-3 10:29:51 | 只看该作者
全局:
终于做完了。卡在constructor,this 和 tostring很久。需要学习基础知识和简化code。

hw2.PNG (32.06 KB, 下载次数: 1)

hw2.PNG

评分

参与人数 1学分 +1 收起 理由
yingy4 + 1

查看全部评分

回复

使用道具 举报

🔗
a49481 2017-4-8 14:44:09 | 只看该作者
全局:


这里介绍一种常数时间复杂度的difference函数实现:
由于除了闰年都是1年365天,因此这里的关键是在于判断两个年份之间闰年的个数:
闰年个数 = 2年份间所有4的倍数 - 2个年份间经过的所有100的倍数 + 2年份间经过的所有400的倍数。

所以关键的问题又转化为了如何判断两个数a和b之间的c的倍数的个数,注意到对任意的a和c:

在a到a+c-1之间(含边界)有且只有1个c的倍数;
在a+c到a+2c-1之间(含边界)有且只有1个c的倍数;
...
在a+kc到a+(k+1)c-1之间(含边界)有且只有1个c的倍数;

于是可以知道:在a到a+kc-1之间(含边界)一定有且只有k个c的倍数;

然后注意到另一个事实:一定存在1个整数n,使得a+nc-1<b<=a+(n+1)c-1成立。
根据上面的结论,可以知道,只要找到这个n,那么a和b之间c的倍数个数(含边界)就等于:n 加上 (a+nc)和b之间c的倍数个数。而要求 (a+nc)和b之间c的倍数个数,只需要遍历 (a+nc)到b,逐个检查是否能够被c整除,最多也只要循环c次就能求得结果。

因此只要能求得上述的n的值,就能以O(c)的复杂度计算出两个数a和b之间的c的倍数的个数。
而n实际上非常好求,注意到有:n = [(b+1-a)/c],于是我们得到了一个以O(c)的时间复杂度计算两个数a和b之间的c的倍数的个数的算法。

而在闰年个数的计算中,c分别等于4,100以及400,皆是常数,于是我们得到了一个常数时间复杂度O(1),计算两个给定的年份之间所经历的闰年个数的算法,进而可以常数时间复杂度来计算difference的值。

下面贴上我的代码:

  public static int countDivideBy(int startNumber, int endNumber, int divideNumber) {
    if(startNumber > endNumber) {
      return 0;
    }
    int kNumber = (endNumber + 1 - startNumber) / divideNumber;
    for(int i = startNumber + kNumber * divideNumber - 1;i <= endNumber;i++) {
      if(i % divideNumber == 0) kNumber ++;
    }
    return kNumber;
  }
  public static int countLeapYear(int startYear, int endYear) {
    return countDivideBy(startYear,endYear,4) - countDivideBy(startYear,endYear,100) + countDivideBy(startYear,endYear,400);
  }

  public int difference(Date d) {

    if(!isValidDate(d.month,d.day,d.year)){
      System.out.println("Invalid date value!");
      System.exit(0);
    }

    int dayNumberOfYearD = 365;
    int dayNumberOfYearThis = 365;
    if(isLeapYear(d.year)) dayNumberOfYearD++;
    if(isLeapYear(this.year)) dayNumberOfYearThis++;

    if(this.year == d.year) return this.dayInYear() - d.dayInYear();
    if(this.year > d.year) {
      return this.dayInYear() + (dayNumberOfYearD - d.dayInYear()) + 365*(this.year - d.year - 1) + countLeapYear(d.year+1,this.year-1);      
    } else {
      return -(dayNumberOfYearThis - this.dayInYear()) - d.dayInYear() - 365*(d.year - this.year - 1) - countLeapYear(this.year+1,d.year-1);
    }                          // replace this line with your solution
  }

评分

参与人数 1学分 +1 收起 理由
yingy4 + 1

查看全部评分

回复

使用道具 举报

🔗
zh 2017-4-8 16:50:39 | 只看该作者
全局:
来交作业了,新学了一个String [] d = s.split("/");

屏幕快照 2017-04-08 下午4.47.15.png (136.63 KB, 下载次数: 0)

屏幕快照 2017-04-08 下午4.47.15.png

评分

参与人数 1学分 +1 收起 理由
yingy4 + 1

查看全部评分

回复

使用道具 举报

🔗
-kiki- 2017-4-18 11:20:15 | 只看该作者
全局:
1 需要学习的是如何把overall task 转化为subtasks。
2 public boolean isAfter(Date b) {
        return compareTo(b) > 0;
3 the method of class String: split

hw2.png (28.72 KB, 下载次数: 1)

hw2.png
回复

使用道具 举报

🔗
mrhfw 2017-4-24 20:39:46 | 只看该作者
全局:
打卡   difference那里弄了好久


回复

使用道具 举报

🔗
liniua 2017-4-27 14:57:15 | 只看该作者
全局:
本帖最后由 liniua 于 2017-4-27 15:00 编辑



Testing constructors.
Date should be 1/1/1: 1/1/1
Date should be 2/4/2: 2/4/2
Date should be 2/29/2000: 2/29/2000
Date should be 2/29/1904: 2/29/1904
Date should be 12/31/1975: 12/31/1975
Date should be 1/1/1976: 1/1/1976
Date should be 1/2/1976: 1/2/1976

Testing LeapYear:
12/31/1975is a leap year: (should be false)false
1/1/1976is a leap year: (should be true)true

Testing daysInMonth:
12/31/1975 has 31 days in month

Testing dayinyear:
12/31/1975is the 365th day.
1/1/1976is the 1th day.

Testing before and after.
1/1/1976 after 12/31/1975 should be true: true
1/2/1976 after 1/1/1976 should be true: true
12/31/1975 after 12/31/1975 should be false: false
12/31/1975 after 1/1/1976 should be false: false
1/1/1976 after 1/2/1976 should be false: false
12/31/1975 before 1/1/1976 should be true: true
1/1/1976 before 1/2/1976 should be true: true
12/31/1975 before 12/31/1975 should be false: false
1/1/1976 before 12/31/1975 should be false: false
1/2/1976 before 1/1/1976 should be false: false

Testing difference.
12/31/1975 - 12/31/1975 should be 0: 0
1/1/1976 - 12/31/1975 should be 1: 1
1/2/1976 - 12/31/1975 should be 2: 2
1/2/1976 - 2/27/1977 should be -422: -422
8/31/2110 - 2/27/1977 should be 48762: 48762

Process finished with exit code 0
回复

使用道具 举报

🔗
mmyn 2017-4-27 19:59:13 | 只看该作者
全局:
交作业!!!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号
隐私提醒:
  • ☑ 禁止发布广告,拉群,贴个人联系方式:找人请去🔗同学同事飞友,拉群请去🔗拉群结伴,广告请去🔗跳蚤市场,和 🔗租房广告|找室友
  • ☑ 论坛内容在发帖 30 分钟内可以编辑,过后则不能删帖。为防止被骚扰甚至人肉,不要公开留微信等联系方式,如有需求请以论坛私信方式发送。
  • ☑ 干货版块可免费使用 🔗超级匿名:面经(美国面经、中国面经、数科面经、PM面经),抖包袱(美国、中国)和录取汇报、定位选校版
  • ☑ 查阅全站 🔗各种匿名方法

本版积分规则

>
快速回复 返回顶部 返回列表