学习内容
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;
}
还有几题没弄出来。。。。下个星期有时间问一哈。