/*
* File: amazonOnline_test1.cpp
* Question 1:
We have an array representing customer’s shopping records.
For example, it’s an array like this:
custA, item1,
custB, item1,
custA, item2,
custB, item3,
custC, item1,
custC, item3,
custD, item2,
This array indicates that customer A bought item 1, customer B bought item 1, customer A bought item 2, customer B bought
item 3, etc..
For a given item X and shopping records array, write code to find out what else (item Y) was bought mostly by the customers
who bought item X.
For example, in above example, if X is item 1 then Y should be item 3.
Rules:
1. One customer can only buy one item once.
2. The mostly brought item should not be item X.
3. If no customer brought item X, then return “None”
4. If all the customers who brought item X only brought item X, then return “None”
5. The first line of input is the item X. The second line of input is the shopping record array, this shopping record array is
split by space.
6. If there are many other mostly brought items which have equally brought times, then return any one of those items.
Examples:
Input1:
item1
custA item1 custB item1 custA item2 custB item3 custC item1 custC item3 custD item2
Output1:
item3
Input2:
item2
custA item1 custB item1 custC item1 custA item2 custB item3 custA item3
Output2:
item1
(The output2 can be item3 too)
*
*/
#include <iostream>
#include <string>
#include <map>
#include <set>
#include <algorithm>
#include <cstring>
#include <cstdio>
using namespace std;
char* findMostlyBroughtItem(char* shippingRecordArray[], int length, char* givenItem);
/*
/a:蜂鸣,响铃
/b:回退:向后退一格
/f:换页
/n:换行,光标到下行行首
/r:回车,光标到本行行首
/t:水平制表
/v:垂直制表
//:反斜杠
/':单引号
/":双引号
/?:问号
/ddd:三位八进制
/xhh:二位十六进制
/0:空字符(NULL),什么都不做
*/
inline bool isSpace(char x){
return x == ' ' || x == '\r' || x == '\n' || x == '\f' || x == '\b' || x == '\t';
}
char* rightTrim(char *str){
int len = strlen(str);
while(--len>=0){
if(isSpace(str[len])){
str[len] = '\0';
}else{
break;
}
}
return str;
}
char * getInputLine(char *buffer, int length){
if(fgets(buffer,length, stdin)==NULL){
return NULL;
}
rightTrim(buffer);
if(strlen(buffer)<=0){
return NULL;
}
return buffer;
}
int splitAndConvert(char* strings,char* array[]){
char* tokenPtr = strtok(strings," ");
int i=0;
while(tokenPtr!=NULL){
array[i] = tokenPtr;
i++;
tokenPtr=strtok(NULL," ");
}
return i;
}
int main() {
char givenItem[1000] = {0} ;
while(getInputLine(givenItem, 1000)){
char line[1000];
getInputLine(line, 1000);
char* shoppingRecordArray[1000] = {0};
int length = splitAndConvert(line,shoppingRecordArray);
if(length==0){
break;
}
char * item = findMostlyBroughtItem(shoppingRecordArray, length, givenItem);
if (NULL != item)
{ // 原来系统提供的代码。这里没有NULL判断
cout<<item<<endl;
free(item); // 自己加的
}
}
return 0;
}
char* findMostlyBroughtItem(char* shoppingRecordArray[], int length, char* givenItem){
if(NULL==shoppingRecordArray || NULL==givenItem || length <=0)
return NULL;
//save shopping records
multimap<string,string> mymap;
multimap<string,string>::iterator mapit;
multimap<string,string>::iterator mapit2;
//save merchants and its number to be bought
map<string, int> buymap;
map<string, int>::iterator itbuymap;
for(int i=0;i<length;i++){
string customer(shoppingRecordArray[i++]);
string item(shoppingRecordArray[i]);
mymap.insert(make_pair(customer,item));
}
string searchitem(givenItem);
for(mapit=mymap.begin();mapit!=mymap.end();mapit++){
//item found
if(searchitem==mapit->second) {
for(mapit2=mymap.begin();mapit2 != mymap.end();mapit2++) {
if(mapit->first==mapit2->first) {
itbuymap=buymap.find(mapit2->second);
if(itbuymap==buymap.end())
buymap.insert(make_pair(mapit2->second,1));
else
buymap[mapit2->second]++;
}
}
}
}
pair<string, int> founditem("",0);
for(itbuymap=buymap.begin();itbuymap!=buymap.end();itbuymap++){
if(itbuymap->first !=searchitem && itbuymap->second > founditem.second)
founditem=make_pair(itbuymap->first,itbuymap->second);
}
char *p=NULL;
if(founditem.first != "") {
cout <<founditem.first<<endl;
p=new char[founditem.first.length()+1];
strcpy(p,founditem.first.c_str());
}
return p;
}
* File: amazonOnline_test1.cpp
* Question 1:
We have an array representing customer’s shopping records.
For example, it’s an array like this:
custA, item1,
custB, item1,
custA, item2,
custB, item3,
custC, item1,
custC, item3,
custD, item2,
This array indicates that customer A bought item 1, customer B bought item 1, customer A bought item 2, customer B bought
item 3, etc..
For a given item X and shopping records array, write code to find out what else (item Y) was bought mostly by the customers
who bought item X.
For example, in above example, if X is item 1 then Y should be item 3.
Rules:
1. One customer can only buy one item once.
2. The mostly brought item should not be item X.
3. If no customer brought item X, then return “None”
4. If all the customers who brought item X only brought item X, then return “None”
5. The first line of input is the item X. The second line of input is the shopping record array, this shopping record array is
split by space.
6. If there are many other mostly brought items which have equally brought times, then return any one of those items.
Examples:
Input1:
item1
custA item1 custB item1 custA item2 custB item3 custC item1 custC item3 custD item2
Output1:
item3
Input2:
item2
custA item1 custB item1 custC item1 custA item2 custB item3 custA item3
Output2:
item1
(The output2 can be item3 too)
*
*/
#include <iostream>
#include <string>
#include <map>
#include <set>
#include <algorithm>
#include <cstring>
#include <cstdio>
using namespace std;
char* findMostlyBroughtItem(char* shippingRecordArray[], int length, char* givenItem);
/*
/a:蜂鸣,响铃
/b:回退:向后退一格
/f:换页
/n:换行,光标到下行行首
/r:回车,光标到本行行首
/t:水平制表
/v:垂直制表
//:反斜杠
/':单引号
/":双引号
/?:问号
/ddd:三位八进制
/xhh:二位十六进制
/0:空字符(NULL),什么都不做
*/
inline bool isSpace(char x){
return x == ' ' || x == '\r' || x == '\n' || x == '\f' || x == '\b' || x == '\t';
}
char* rightTrim(char *str){
int len = strlen(str);
while(--len>=0){
if(isSpace(str[len])){
str[len] = '\0';
}else{
break;
}
}
return str;
}
char * getInputLine(char *buffer, int length){
if(fgets(buffer,length, stdin)==NULL){
return NULL;
}
rightTrim(buffer);
if(strlen(buffer)<=0){
return NULL;
}
return buffer;
}
int splitAndConvert(char* strings,char* array[]){
char* tokenPtr = strtok(strings," ");
int i=0;
while(tokenPtr!=NULL){
array[i] = tokenPtr;
i++;
tokenPtr=strtok(NULL," ");
}
return i;
}
int main() {
char givenItem[1000] = {0} ;
while(getInputLine(givenItem, 1000)){
char line[1000];
getInputLine(line, 1000);
char* shoppingRecordArray[1000] = {0};
int length = splitAndConvert(line,shoppingRecordArray);
if(length==0){
break;
}
char * item = findMostlyBroughtItem(shoppingRecordArray, length, givenItem);
if (NULL != item)
{ // 原来系统提供的代码。这里没有NULL判断
cout<<item<<endl;
free(item); // 自己加的
}
}
return 0;
}
char* findMostlyBroughtItem(char* shoppingRecordArray[], int length, char* givenItem){
if(NULL==shoppingRecordArray || NULL==givenItem || length <=0)
return NULL;
//save shopping records
multimap<string,string> mymap;
multimap<string,string>::iterator mapit;
multimap<string,string>::iterator mapit2;
//save merchants and its number to be bought
map<string, int> buymap;
map<string, int>::iterator itbuymap;
for(int i=0;i<length;i++){
string customer(shoppingRecordArray[i++]);
string item(shoppingRecordArray[i]);
mymap.insert(make_pair(customer,item));
}
string searchitem(givenItem);
for(mapit=mymap.begin();mapit!=mymap.end();mapit++){
//item found
if(searchitem==mapit->second) {
for(mapit2=mymap.begin();mapit2 != mymap.end();mapit2++) {
if(mapit->first==mapit2->first) {
itbuymap=buymap.find(mapit2->second);
if(itbuymap==buymap.end())
buymap.insert(make_pair(mapit2->second,1));
else
buymap[mapit2->second]++;
}
}
}
}
pair<string, int> founditem("",0);
for(itbuymap=buymap.begin();itbuymap!=buymap.end();itbuymap++){
if(itbuymap->first !=searchitem && itbuymap->second > founditem.second)
founditem=make_pair(itbuymap->first,itbuymap->second);
}
char *p=NULL;
if(founditem.first != "") {
cout <<founditem.first<<endl;
p=new char[founditem.first.length()+1];
strcpy(p,founditem.first.c_str());
}
return p;
}