1.2.1^
^(表示待优化的程序)
import edu.princeton.cs.algs4.Counter;
import edu.princeton.cs.algs4.Interval1D;
import edu.princeton.cs.algs4.Interval2D;
import edu.princeton.cs.algs4.Point2D;
import edu.princeton.cs.algs4.StdOut;
public class Exercise1_2_1 {
public static void main(String[] args){
int N = Integer.parseInt(args[0]);
Interval1D xinterval = new Interval1D(.1,.9);//这里的面积为0.64
Interval1D yinterval = new Interval1D(.1,.9);
Interval2D box = new Interval2D(xinterval,yinterval);
box.draw();
double[][] poly = new double[N][2];
Counter c = new Counter("hits");
for(int i = 0;i < N;i++){
double x = Math.random();
double y = Math.random();
Point2D p = new Point2D(x,y);
poly[i][0] = x;
poly[i][1] = y;
if(!box.contains(p))
c.increment();
else
p.draw();
}
double[] d = new double[N];
for(int i = 0;i < N - 1;i++){
for(int j = i + 1;j < N;j++){
d[i] = (poly[i][0] - poly[j][0]) * (poly[i][0] - poly[j][0]) + (poly[i][1] - poly[j][1]) * (poly[i][1] - poly[j][1]);
}
}
double m = d[0];
for(int i = 0; i < N - 1;i++){
//StdOut.println(d[i]);
if(m > d[i])
m = d[i];
}
StdOut.println(Math.sqrt(m));
StdOut.println(c);
StdOut.println(box.area());
}
}
1.2.2
import edu.princeton.cs.algs4.Interval1D;
import edu.princeton.cs.algs4.StdDraw;
import edu.princeton.cs.algs4.StdIn;
import edu.princeton.cs.algs4.StdOut;
public class Exercise1_2_2{
public static void main(String[] args){
int N = Integer.parseInt(args[0]);
Interval1D[] interval = new Interval1D[N];
double[] d = StdIn.readDoubles();
for(int i = 0;i < N;i++){
interval[i] = new Interval1D(d[2 * i],d[2 * i + 1]);
for(int j = N / 2;j < N;j++){
if(i != j)
if(interval[i].intersects(interval[j])){
StdDraw.line(interval[i].left(),0.5,interval[i].right(),0.5);
StdOut.println("Interval[" + i + "] intersects with Interval[" + j + "]");
}
}
}
}
}
1.2.3
import edu.princeton.cs.algs4.Interval1D;
import edu.princeton.cs.algs4.Interval2D;
import edu.princeton.cs.algs4.Point2D;
import edu.princeton.cs.algs4.StdDraw;
import edu.princeton.cs.algs4.StdOut;
public class Exercise1_2_3{
public static void main(String[] args){
StdOut.println("Enter N: ");
int N = Integer.parseInt(args[0]);
StdOut.println("Enter min and max: ");
double min = Double.parseDouble(args[1]);
double max = Double.parseDouble(args[2]);
StdDraw.setXscale(0,1);
StdDraw.setYscale(0,1);
StdDraw.setPenRadius(0.001);
StdDraw.setPenColor(StdDraw.RED);
Interval2D[] box = new Interval2D[N];
Interval1D[] xinterval = new Interval1D[N];
Interval1D[] yinterval = new Interval1D[N];
double average = max - min;
Point2D[][] p = new Point2D[N][2];
for(int i = 0;i < N;i++){
double x = Math.random();
double y = Math.random();
double x1 = x + average * Math.random();
double y1 = y + average * Math.random();
if(x1 > 1) x1 = 1;
if(y1 > 1) y1 = 1;
p[i][0] = new Point2D(x,y);
p[i][1] = new Point2D(x1,y1);
xinterval[i] = new Interval1D(x,x1);
yinterval[i] = new Interval1D(y,y1);
box[i] = new Interval2D(xinterval[i],yinterval[i]);
box[i].draw();
}
for(int i = 0;i < N -1;i++)
for(int j = i + 1;j < N;j++){
StdDraw.setPenColor(StdDraw.BLACK);
box[i].draw();
box[j].draw();
}
for(int i = 0;i < N - 1;i++)
for(int j = i + 1;j < N;j++){
if(box[i].contains(p[j][0]) && box[j].contains(p[j][1])){
StdDraw.setPenRadius(0.005);
StdDraw.setPenColor(StdDraw.BLUE);
box[i].draw();
StdDraw.setPenColor(StdDraw.GREEN);
box[j].draw();
StdOut.println("i = " + i + "j = " + j + " " + box[i].toString() + box[j].toString());
}
}
}
}
1.2.4
world
hello
1.2.5
(书上有答案)
“Hello World”。String对象是不可变的——所有字符串方法都会返回一个新的String对象(但它们不会改变参数对象的值)。这段代码忽略了返回的对象并直接打印了原字符串。要打印出”WORLD”,请用s = s.toUpperCase()和s = s.substring(6,11)。
1.2.6
import edu.princeton.cs.algs4.StdOut;
public class Exercise1_2_6{
public static void main(String[] args){
String s = "ACTGACG";
String t = "TGACGAC";
String p = s.concat(s);
if(s.length() == t.length() && p.indexOf(t) > 0)
StdOut.println("Yes!");
else
StdOut.println("No!");
}
}
1.2.7
自己写一下代码操作一下即可
例:
import edu.princeton.cs.algs4.StdOut;
public class Exercise1_2_7{
public static String mystery(String s){
int N = s.length();
if(N <= 1) return s;
String a = s.substring(0,N / 2);
String b = s.substring(N / 2,N);
StdOut.println(a + b);
return mystery(b) + mystery(a);
}
public static void main(String[] args){
String s = "0123456789";
String a = mystery(s);
StdOut.println("a = " + a);
}
}
结果为:
0123456789
56789
789
89
56
01234
234
34
01
a = 9876543210
1.2.8
(书上有答案)
这段代码会将它们交换。它的效率不可能再高了,因为它复制的是引用而不需要复制数百万个元素。
1.2.9
import java.util.Arrays;
import edu.princeton.cs.algs4.Counter;
import edu.princeton.cs.algs4.In;
import edu.princeton.cs.algs4.StdIn;
import edu.princeton.cs.algs4.StdOut;
public class Exercise1_2_9 {
public static int rank(int key,int[] a,Counter keys){
int lo = 0;
int hi = a.length - 1;
keys.increment();
while(lo <= hi){
int mid = lo + (hi - lo) / 2;
if(key < a[mid]) hi = mid - 1;
else if(key > a[mid]) lo = mid + 1;
else return mid;
}
return -1;
}
public static void main(String[] args){
Counter keys = new Counter("keys");
int[] whitelist = In.readInts(args[0]);
Arrays.sort(whitelist);
while(!StdIn.isEmpty()){
int key = StdIn.readInt();
if(rank(key,whitelist, keys) < 0)
StdOut.println(key);
}
StdOut.println("\t" + keys);
}
}
1.2.10
import edu.princeton.cs.algs4.StdDraw;
import edu.princeton.cs.algs4.StdOut;
public class Exercise1_2_10{
private int count;
private int val;
private int x = 0;
int maxOperation;
int maxVal;
public Exercise1_2_10(int N,int max){
maxOperation = N;
maxVal = max;
StdDraw.setXscale(0,N);
StdDraw.setYscale(-max,max);
StdDraw.setPenRadius(0.05);
StdDraw.setPenColor(StdDraw.RED);
}
public int tally(){
return count;
}
public void increment(){
if(count < maxOperation && val < maxVal){
count++;
val++;
x++;
StdDraw.point(x,val);
}
}
public void decrement(){
if(count < maxOperation && val > -maxVal){
count++;
val--;
x++;
StdDraw.point(x,val);
}
}
public static void main(String[] args){
Exercise1_2_10 VC = new Exercise1_2_10(10,20);
VC.increment();
VC.increment();
VC.decrement();
VC.decrement();
VC.decrement();
VC.decrement();
VC.decrement();
VC.decrement();
VC.decrement();
VC.decrement();
VC.decrement();
VC.decrement();
StdOut.println(VC.tally());
}
}
1.2.11
public class SmartDate{
private final int month;
private final int day;
private final int year;
public SmartDate(int m,int d,int y){
month = m;
day = d;
year = y;
if(month < 13 && month > 0){
switch(month){
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
if(day > 31 || day < 1)
throw new RuntimeException("Error: illegal Date");
break;
case 4:
case 6:
case 9:
case 11:
if(day > 30||day < 1)
throw new RuntimeException("Error:illegal Date");
break;
case 2:
if(year % 4 == 0){
if(day > 29 || day < 1)
throw new RuntimeException("Error:illegal Date");
}else if(day > 28|| day < 1)
throw new RuntimeException("Error: illegal Date");
}
}
else throw new RuntimeException("Error: illegal Date");
}
public static void main(String[] args){
SmartDate SD = new SmartDate(Integer.parseInt(args[0]),Integer.parseInt(args[1]),Integer.parseInt(args[2]));
}
}
1.2.12
import edu.princeton.cs.algs4.StdOut;
public class SmartDate {
private final int month;
private final int day;
private final int year;
public int dayOfTheWeek;
public SmartDate(int m, int d, int y)
{
month = m;
day = d;
year = y;
if (month < 13 && month >0 )
{
switch(month)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
if (day > 31 || day < 1)
throw new RuntimeException("Error: illegal Date");
break;
case 4:
case 6:
case 9:
case 11:
if (day > 30 || day < 1)
throw new RuntimeException("Error: illegal Date");
break;
case 2:
if (year % 4 == 0)
{
if (day > 29 || day < 1)
throw new RuntimeException("Error: illegal Date");
}
else if (day > 28 || day < 1)
throw new RuntimeException("Error: illegal Date");
}
}
else throw new RuntimeException("Error: illegal Date");
}
public int month()
{ return month; }
public int day()
{ return day; }
public int year()
{ return year; }
public void dayOfTheWeek()
{
dayOfTheWeek = (year+(year/4)-15+(26*(month+1)/10)+day-1)%7;//using Zeller formula to obtain the value
switch(dayOfTheWeek)
{
case 1:
StdOut.println("Monday");
break;
case 2:
StdOut.println("Tuesday");
break;
case 3:
StdOut.println("Wednesday");
break;
case 4:
StdOut.println("Thursday");
break;
case 5:
StdOut.println("Friday");
break;
case 6:
StdOut.println("Saturday");
break;
case 7:
StdOut.println("Sunday");
break;
}
}
public static void main(String[] args)
{
SmartDate SD = new SmartDate(Integer.parseInt(args[0]),Integer.parseInt(args[1]),Integer.parseInt(args[2]));
SD.dayOfTheWeek();
}
}
1.2.13
(仅供参考,欢迎指正)
public class Transaction{
private String who;
private SmartDate when;
private double amount;
public Transaction(String who,SmartDate when,double amount){
if(who == null)
throw new IlllegalArgumentException("Illegal date");
this.who = who;
this.when = when;
this.amount = amount;
}
public String toString(){
return (who + " " + when.toString() + " " + amount);
}
public String getWho(){
return who;
}
public void setWho(String who){
this.who = who;
}
public SmartDate getWhen(){
return when;
}
public void setWhen(SmartDate when){
this.when = when;
}
public double getAmount(){
return amount;
}
public void setAmount(double amount){
this.amount = amount;
}
public int compareTo(Transaction that){
return this.when.compareTo(that.when);
}
public int hashCode(){
return this.toString().hashCode();
}
}
1.2.14
(仅供参考,欢迎指正)
public class Transaction{
private String who;
private SmartDate when;
private double amount;
public Transaction(String who,SmartDate when,double amount){
if(who == null)
throw new IllegalArgumentException("Illegal date");
this.who = who;
this.when = when;
this.amount = amount;
}
public String toString(){
return (who + " " + when.toString() + " " + amount);
}
public String getWho(){
return who;
}
public void setWho(String who){
this.who = who;
}
public SmartDate getWhen(){
return when;
}
public void setWhen(SmartDate when){
this.when = when;
}
public double getAmount(){
return amount;
}
public void setAmount(double amount){
this.amount = amount;
}
public boolean equals(Object x){
if(this == x)
return true;
if(x == null)
return false;
if(this.getClass() != x.getClass())
return false;
Transaction that = (Transaction) x;
if(this.who != that.who)
return false;
if(this.when != that.when)
return false;
if(this.amount != that.amount)
return false;
return true;
}
public int compareTo(Transaction that){
return this.when.comparaTo(that.when);
}
public int hashCode(){
return this.toString().hashCode();
}
}