第六周周报

学习内容

1.java

2.啊哈算法

3.一些算法题

一、java

1.发红包案例(继承的使用,顺便复习了随机数和Arrylist)*

用户类(父类)

package day11;

public class User {
   String name;
   int money;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getMoney() {
        return money;
    }

    public void setMoney(int money) {
        this.money = money;
    }

    public User() {
    }

    public User(String name, int money) {
        this.name = name;
        this.money = money;
    }
    public void show(){
        System.out.println("姓名:"+name+",剩余金额"+money);
    }
}

群主类:

package day11;

import java.util.ArrayList;

public class Manager extends User {
    public Manager() {
    }

    public Manager(String name, int money) {
        super(name, money);
    }
    public ArrayList<Integer> send(int val,int cnt){
        ArrayList<Integer> redList = new ArrayList<>();
        super.setMoney(super.getMoney() - val);
        int avg = val/cnt;
        int mod = val%cnt;
        int leftmoney = super.getMoney();
        if(val>leftmoney)
        {
            System.out.println("余额不足!");
            return redList;
        }
        for (int i = 0; i < cnt-1; i++) {
            redList.add(avg);
        }
        redList.add(mod+avg);
        return redList;
    }
}

成员类:

package day11;

import java.util.ArrayList;
import java.util.Random;

public class Member extends User {
    public Member() {
    }

    public Member(String name, int money) {
        super(name, money);
    }
    public void receive(ArrayList<Integer> list){
        int index = new Random().nextInt(list.size());
        int n = list.remove(index);
        setMoney(n+getMoney());
    }
}

主函数

package day11;

import java.util.ArrayList;
import java.util.Random;

public class RedPakage {
    public static void main(String[] args) {
        Member one = new Member("A",0);
        Member two = new Member("B",0);
        Member three = new Member("C",0);
        Manager manager = new Manager("群主",100);
        one.show();
        two.show();
        three.show();
        manager.show();
        System.out.println("--------------------");
        ArrayList<Integer> list = manager.send(20,3);
        one.receive(list);
        two.receive(list);
        three.receive(list);
        one.show();
        two.show();
        three.show();
        manager.show();


    }
}

2.接口(具体演示在day12)

定义:接口就是一类东西的规范。

接口的内容总结:

在这里插入图片描述
注:成员变量访问时直接使用接口名称.因为前面有static修饰,是属于这个类的。

注意事项:

在这里插入图片描述
接口没有静态代码块或者构造方法(不能new接口)
优先级:继承大于接口。

类与接口的区别和接口的多继承

在这里插入图片描述
类于类之间是单继承的,直接父类只能有一个。
类与接口之间是多实现的,一个类能实现多个接口
接口与接口之间是多继承的,一个接口能继承多个接口。

多个父接口当中的 抽象方法冲突,没关系,因为抽象方法没有方法体。
多个父接口当中的默认方法冲突时,子接口必须进行覆盖重写,(必须带着default关键字)

二、啊哈算法

纸牌游戏(站和队列的使用)
代码:

# include<stdio.h>
# include<stdlib.h>

typedef struct queue
{
	int data[101];
	int head;
	int tail;
}queue;

typedef struct stack
{
	int data[10];
	int top;
}stack;

int main(void)
{
	queue q1,q2;
	stack s;
	q1.head = 0;
	q1.tail = 0;
	q2.head = 0;
	q2.tail = 0;
	s.top = 0;
	int i,j,t;
	int book[10] = {}; 
	printf("小哼的牌:\n");
	for(i = 0;i<6;++i)
	{
		scanf("%d",&q1.data[q1.tail]); 
		q1.tail++;
	}
	printf("小哈的牌:\n");
	for(i = 0;i<6;++i)
	{
		scanf("%d",&q2.data[q2.tail]); 
		q2.tail++;
	}
	while(q1.head!=q1.tail&&q2.head!=q2.tail)
	{
		t = q1.data[q1.head];
		if(book[t]==1)
		{
			q1.head++;
			q1.data[q1.tail] = t;
			q1.tail++;
			while(s.data[s.top]!=t)
			{
				book[s.data[s.top]] = 0;
				q1.data[q1.tail] = s.data[s.top];
				q1.tail++;
				s.top--;
			}
			book[s.data[s.top]] = 0;
			q1.data[q1.tail] = s.data[s.top];
			s.top--;
			q1.tail++;
		}
		else
		{
			book[t] = 1;
			q1.head++;
			s.top++;
			s.data[s.top] = t;
		}
		if(q1.tail==q1.head)
		break;
		t = q2.data[q2.head];
		if(book[t]==1)
		{
			q2.head++;
			q2.data[q2.tail] = t;
			q2.tail++;
			while(s.data[s.top]!=t)
			{
				book[s.data[s.top]] = 0;
				q2.data[q2.tail] = s.data[s.top];
				q2.tail++;
				s.top--;
			}
			book[s.data[s.top]] = 0;
			q2.data[q2.tail] = s.data[s.top];
			s.top--;
			q2.tail++;
		}
		else
		{
			book[t] = 1;
			q2.head++;
			s.top++;
			s.data[s.top] = t;
		}
	}
	if(q2.head==q2.tail)
	{
		printf("小哼获胜\n");
		printf("小哼剩下的牌时:\n");
		for(i = q1.head;i<q1.tail;++i)
		{
			printf("%d ",q1.data[i]);
		}
		printf("\n")
		if(s.top>0)
		{
			printf("桌上的牌时:\n");
			for(i = 1;i<=s.top;++i)
			printf("%d",s.data[i]);
		}
		else
		printf("桌面上没拍\n");
	}
	else
	{
		printf("小哈获胜\n");
		printf("小哈剩下的牌时:\n");
		for(i = q2.head;i<q2.tail;++i)
		{
			printf("%d ",q2.data[i]);
		}
		printf("\n");
		if(s.top>0)
		{
			printf("桌上的牌时:\n");
			for(i = 1;i<=s.top;++i)
			printf("%d",s.data[i]);
		}
		else
		printf("桌面上没拍\n");
	}
	
	getchar();getchar();
	return 0;
}

**注:**里面的book[]数组实现的是查重的功能。
1.先赋给两个人手牌。
因为是小哼先出,就把小哼的函数写在前面。
首先顶一个临时变量t,存储的是每次打出去的牌,然后进行判断,如果book[t] = 1.则表明牌堆里面已经出现过t,就进行取牌的操作,每次都要。如果book【t】= 0,就证明没有出现过,就让book[t] = 1,然后head++,出队列,top++将牌入栈。
下面的分析就很简单了。

三、算法题

新生赛的题(存在F盘)
A-永远的王聪明王
这一题我用的结构体数组,代码:

# include<stdio.h>
# include<stdlib.h>

typedef struct Node
{
	int time;
	char name[101];
}node,*pnode;

int main(void)
{
	int n;
	scanf("%d",&n);
	pnode p = (pnode)malloc(n*sizeof(node));
	for(int m = 0;m<n;++m)
	{
		scanf("%s",p[m].name);
		scanf("%d",&p[m].time);
	}
	int i,j,t;
	for(i = 0;i<n-1;++i)
	{
		for(j = 0;j<n-1-i;++j)
		{
			if(p[j].time>p[j+1].time)
			{
				t = p[j].time;
				p[j].time = p[j+1].time;
				p[j+1].time = t;
			}
		}
	}
	
	
	for(int k = 0;k<n;++k)
	{
		printf("%s %d",p[k].name,p[k].time);
		printf("\n");
	}
	
	return 0;
} 

定义了一个结构体指针p指向了一个大小为n*sizeof(node)的数组空间,就跟普通的数组一样,可以通过下标索引值来访问。
C-矩阵求和
也没啥,找规律填数组的题。

# include<stdio.h>
int main(void)
{
	int m,n,i,j,q,val;
	scanf("%d",&n);
	scanf("%d",&m);
	int a[n+1][m+1] = {};
	for(i = 1;i<n+1;++i) 
	{
		for(j = 1;j<m+1;++j)
		{
			scanf("%d",&val);
			a[i][j] = val;
		}
	}
	int sum = 0;
	scanf("%d",&q);
	for(i = 0;i<1;++i)
{
	int x1,y1,x2,y2,x3,y3,x4,y4;
	scanf("%d",&x1);
	scanf("%d",&y1);
	scanf("%d",&x2);
	scanf("%d",&y2);
	scanf("%d",&x3);
	scanf("%d",&y3);
	scanf("%d",&x4);
	scanf("%d",&y4);
	int sum1 = 0,sum2 = 0;
	for(i = x1;i<=x2;++i)
	{
		for(j = y1;j<=y2;++j)
		{
			sum1+=a[i][j];
		}
	}
	for(i = x3;i<=x4;++i)
	{
		for(j = y3;j<=y4;++j)
		{
			sum1+=a[i][j];
		}
	}
	if(x2==x3&&y2==y3)
	sum = sum+sum1+sum2-a[x2][y2];
	else
	sum = sum+sum1+sum2;
}
	printf("%d",sum);
	
/*	for(i = 1;i<n+1;++i) 
	{
		for(j = 1;j<m+1;++j)
		{
			printf("%d",a[i][j]);
		}
		printf("\n");
	}
	printf("%d",a[1][1]);
*/	
	return 0;
}

M-水题
又是找规律的题。在草稿纸上多比划一下就行。

# include<stdio.h>
int main(void)
{
	int x,n,k,t;
	scanf("%d",&t);
	int a[t];
	for(int i = 0;i<t;++i)
{		
	scanf("%d",&n);
	scanf("%d",&k);
	int cnt;
	if(n-k>=0&&((n-k)%2==0))
		cnt = 0;  
	if(n-k>=0&&((n-k)%2!=0))
		cnt = 1;
	if(n-k<0)
		cnt = k-n;
	a[i] = cnt;
}
	for(int i = 0;i<t;++i)
	{
		printf("%d\n",a[i]);
	}
	return 0;
}

还有几题没弄出来。。。。下个星期有时间问一哈。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值