I have received a takehome test from a company I’m interviewing with and it’s on the platform Codesignal. Luckily, Codesignal provides me with a practice test I can use to test out its platform! It times me and gives me a challenge:
import IntegerContainerInterface from './integerContainerInterface';
export default class IntegerContainer extends IntegerContainerInterface {
nums: number[]
constructor() {
super();
this.nums = []
// TODO: implement
}
add(value: number): number {
this.nums.push(value)
return this.nums.length
}
delete(value: number): boolean {
let exists = false
/* failing here
expect(container.add(555)).to.deep.equal(1);
expect(container.delete(555)).to.be.true;
expect(container.delete(555)).to.be.false;
expect(container.add(555)).to.deep.equal(1);
expect(container.delete(555)).to.be.true;
expect(container.delete(555)).to.be.false;
*/
this.nums = this.nums.map(val => {
if (val === value && exists === false){
exists = true
return null
}
return val
})
this.nums = this.nums.filter(Boolean)
return exists
}
// TODO: implement interface methods here
}
Takeaways from stage one:
- looking at test cases really helped
- forEach, map, sort, know what it returns and how it may mutate instead
Stage 2
import IntegerContainerInterface from './integerContainerInterface';
export default class IntegerContainer extends IntegerContainerInterface {
nums: number[]
constructor() {
super();
this.nums = []
// TODO: implement
}
add(value: number): number {
this.nums.push(value)
return this.nums.length
}
delete(value: number): boolean {
let exists = false
/* failing here
expect(container.add(555)).to.deep.equal(1);
expect(container.delete(555)).to.be.true;
expect(container.delete(555)).to.be.false;
expect(container.add(555)).to.deep.equal(1);
expect(container.delete(555)).to.be.true;
expect(container.delete(555)).to.be.false;
*/
this.nums = this.nums.map(val => {
if (val === value && exists === false){
exists = true
return null
}
return val
})
this.nums = this.nums.filter(Boolean)
return exists
}
// [10, 20]
getMedian(): number | null {
this.nums = this.nums.sort((a, b) => a - b)
console.log({nums: this.nums, length: this.nums.length})
if (this.nums.length === 0) return null
if (this.nums.length === 1) return this.nums[0]
if (this.nums.length === 2) return this.nums[0]
// [1, 2, 3, 4] length 4
// 4/2 = 2,
if (this.nums.length % 2 === 0){
return this.nums[(this.nums.length / 2) - 1]
}
// [1, 2, 3], length is 3, middle index is 1
// So length - 1 / 2,
return this.nums[(this.nums.length - 1) / 2]
// Return middle number in the .nums array
// If sequence is even, return the leftmost
// If it's empty, return null
}
// TODO: implement interface methods here
}
Man, the mistakes I made were really silly. For even numbers, I got the correct index, but just straight up returned the index rather than the value AT that index.