lyh2668 / blog

1 stars 0 forks source link

记有赞的两道编程题 #1

Open lyh2668 opened 6 years ago

lyh2668 commented 6 years ago

题目一、生成Mock数据

设计一个生成mock对象的方法
输入为一种mock语法
mock语法长这样

{
    'data.user.name': String,
    'data.user.age': Number,
    'data.isShow': Boolean
}

一条mock规则分为两部分,字段名和数据类型,字段名可嵌套,数据类型支持StringNumberBoolean即可
输出为mock对象,按照mock规则随机生成对象

{
    data: {
        user: {
            name: 'asdfghjkl',
            age: 20
        },
        isShow: true
    }
}

解题思路

代码实现

const obj = {
  'data.user.name': String,
  'data.user.age': Number,
  'data.isShow': Boolean
}

let mock = (obj) => {
  let mockObj = {}

  for (let key in obj) {
    let keys = key.split('.')
    mockData(mockObj, keys, obj[key])
  }
  return mockObj
}

let mockData = (mockObj, arr, type) => {
  let key = arr[0]
  let tmpObj = {}
  if (arr.length === 1) {
    if (typeof type.prototype.valueOf() === 'string') {
      // string, number, boolean
      // 根据类型随机生成数据 
    }
    // 这里先用123模拟
    tmpObj[key] = '123'
    mockObj = Object.assign(mockObj, tmpObj)
    return mockObj
  }
  if (!(key in mockObj)) {
    mockObj[key] = {}
  }
  tmpObj[key] = mockData(mockObj[key], arr.slice(1, arr.length), type)
  mockObj[key] = Object.assign(mockObj[key], tmpObj[key])
  return mockObj
}
mock(obj)

总结

这题本身思路并不难,难度在于递归和对象的合并,但是这道题目花费了我挺长时间的,需要注意的是几个坑点:

题目二、时间分段

给定一个时间段和步长,枚举该时间段内步长的划分
例如:时间段6:00-9:00,步长为45分钟
那么返回的数组为
['6:00-6:45', '6:45-7:30', '7:30-8:15', '8:15-9:00']

解题思路

这题相对第一题简单的多,略微思考一下就有解题思路了

let min2time = (min) => { let hour = parseInt(min / 60) let minute = min - hour * 60 if (hour >= 24) { hour = hour - 24 } if (minute < 10) { minute = '0' + minute } if (hour < 10) { hour = '0' + hour } return ${hour}:${minute} }

let calStep = (start, end, step) => { let startTime = time2min(start) let endTime = time2min(end) if (startTime > endTime) { endTime += 24 * 60 } let arr = [] while (startTime < endTime) { let right = startTime + step > endTime ? endTime : startTime + step arr.push(${min2time(startTime)}-${min2time(right)}) startTime += step } return arr }

calStep('22:10', '0:30', 35)


## 总结
这题由于讲究一个速度,所以没有太多的考虑,从理思路到编写大概用了20分钟时间,所以可能有些写法上还不够严谨。
这题从看到题目的开始我就注意到了可以用转化成分钟来做,然后注意到了可能会有跨天的情况,这个应该算是这道题目的应该坑点吧。