一个 ATM 机器,存有 5 种面值的钞票:20 ,50 ,100 ,200 和 500 美元。初始时,ATM 机是空的。用户可以用它存或者取任意数目的钱。
取款时,机器会优先取 较大 数额的钱。
比方说,你想取 $300 ,并且机器里有 2 张 $50 的钞票,1 张 $100 的钞票和1 张 $200 的钞票,那么机器会取出 $100 和 $200 的钞票。
但是,如果你想取 $600 ,机器里有 3 张 $200 的钞票和1 张 $500 的钞票,那么取款请求会被拒绝,因为机器会先取出 $500 的钞票,然后无法取出剩余的 $100 。注意,因为有 $500 钞票的存在,机器 不能 取 $200 的钞票。
请你实现 ATM 类:
ATM() 初始化 ATM 对象。
void deposit(int[] banknotesCount) 分别存入 $20 ,$50,$100,$200 和 $500 钞票的数目。
int[] withdraw(int amount) 返回一个长度为 5 的数组,分别表示 $20 ,$50,$100 ,$200 和 $500 钞票的数目,并且更新 ATM 机里取款后钞票的剩余数量。如果无法取出指定数额的钱,请返回 [-1] (这种情况下 不 取出任何钞票)。
示例 1:
输入:
[“ATM”, “deposit”, “withdraw”, “deposit”, “withdraw”, “withdraw”]
[[], [[0,0,1,2,1]], [600], [[0,1,0,1,1]], [600], [550]]
输出:
[null, null, [0,0,1,0,1], null, [-1], [0,1,0,0,1]]
解释:
ATM atm = new ATM();
atm.deposit([0,0,1,2,1]); // 存入 1 张 $100 ,2 张 $200 和 1 张 $500 的钞票。
atm.withdraw(600); // 返回 [0,0,1,0,1] 。机器返回 1 张 $100 和 1 张 $500 的钞票。机器里剩余钞票的数量为 [0,0,0,2,0] 。
atm.deposit([0,1,0,1,1]); // 存入 1 张 $50 ,1 张 $200 和 1 张 $500 的钞票。
// 机器中剩余钞票数量为 [0,1,0,3,1] 。
atm.withdraw(600); // 返回 [-1] 。机器会尝试取出 $500 的钞票,然后无法得到剩余的 $100 ,所以取款请求会被拒绝。
// 由于请求被拒绝,机器中钞票的数量不会发生改变。
atm.withdraw(550); // 返回 [0,1,0,0,1] ,机器会返回 1 张 $50 的钞票和 1 张 $500 的钞票。
给出两种做法:
typedef struct {
int money;
struct ATM *next;
} ATM;
ATM* aTMCreate() {
ATM *a=(ATM*)malloc(sizeof(ATM));
int i;
ATM *p;
a->money=0;
a->next=NULL;
for(i=0;i<4;i++){
p=(ATM*)malloc(sizeof(ATM));
p->money=0;
p->next=a->next;
a->next=p;
}
return a;
}
void aTMDeposit(ATM* obj, int* banknotesCount, int banknotesCountSize) {
ATM *p=obj;
int i,j;
for(i=0;i<banknotesCountSize;i++){
p->money=p->money+banknotesCount[i];
printf("%d ",p->money);
p=p->next;
}
}
int* aTMWithdraw(ATM* obj, int amount, int* retSize) {
int po;
ATM *p=obj;
int a[5];
int i;
int a_mo[5]={20,50,100,200,500};
for(i=0;i<5;i++){
a[i]=p->money;
p=p->next;
}
po=4;
while(po>=0&&amount!=0){
if(a[po]==0){
po--;
continue;
}
if(a[po]!=0){
if(a_mo[po]<=amount){
a[po]--;
amount=amount-a_mo[po];
}
else{
po--;
}
}
if(po<0) break;
}
if(amount==0){
p=obj;
for(i=0;i<5;i++){
p->money=a[i];
p=p->next;
}
}
else return -1;
return -1;
}
void aTMFree(ATM* obj) {
}
/**
* Your ATM struct will be instantiated and called as such:
* ATM* obj = aTMCreate();
* aTMDeposit(obj, banknotesCount, banknotesCountSize);
* int* param_2 = aTMWithdraw(obj, amount, retSize);
* aTMFree(obj);
*/
typedef struct {
long long money[5];
// struct ATM *next;
} ATM;
ATM* aTMCreate() {
ATM *a=(ATM*)malloc(sizeof(ATM));
int i;
for(i=0;i<5;i++){
a->money[i]=0;
}
return a;
}
void aTMDeposit(ATM* obj, int* banknotesCount, int banknotesCountSize) {
ATM *p=obj;
int i,j;
for(i=0;i<banknotesCountSize;i++){
p->money[i]=p->money[i]+banknotesCount[i];
// printf("%d ",p->money[i]);
}
}
int* aTMWithdraw(ATM* obj, int amount, int* retSize) {
int po;
ATM *p=obj;
long long* a = (long long*)malloc(sizeof(long long) * 5);
int* b = ( int*)malloc(sizeof( int) * 5);
int i;
int a_mo[5]={20,50,100,200,500};
for(i=0;i<5;i++){
a[i]=p->money[i];
b[i]=0;
}
po=4;
while(po>=0&&amount!=0){
if(a[po]==0){
po--;
continue;
}
if(a[po]!=0){
//printf("%d %d --",a[po],po);
if(a_mo[po]<=amount){
long long n=amount/a_mo[po];
// printf("n1 %d %d %d %d ",a[po],n,amount,a_mo[po]);
if(n>=a[po]){
amount=amount-a_mo[po]*a[po];
// printf("amonunt %d ",amount);
b[po]=a[po];
a[po]=0;
// printf("b[po] po %d %d ",b[po],po);
}
else {
// printf("n2 %d %d ",a[po],n);
amount=amount-a_mo[po]*n;
// printf("amonunt %d ",amount);
a[po]=a[po]-n;
b[po]=n+b[po];
// po--;
}
}
else{
po--;
}
}
if(po<0) break;
}
for(i=0;i<5;i++){
printf("--%d ",b[i]);
}
if(amount==0){
for(i=0;i<5;i++){
p->money[i]=a[i];
}
*retSize=5;
return b;
}
else {
b[0]=-1;
*retSize=1;
return b;
}
// return -1;
}
void aTMFree(ATM* obj) {
}
/**
* Your ATM struct will be instantiated and called as such:
* ATM* obj = aTMCreate();
* aTMDeposit(obj, banknotesCount, banknotesCountSize);
* int* param_2 = aTMWithdraw(obj, amount, retSize);
* aTMFree(obj);
*/