/** * @param {number[]} gas * @param {number[]} cost * @return {number} */var canCompleteCircuit = function(gas, cost) {  if (gas.length === 1) {    return gas[0] < cost[0] ? -1 : 0;  }  const search = (start) => {    let i = 0 ;    let current = 0;    while (i < gas.length) {      const next = start + i++;      current += gas[next % gas.length];      current -= cost[next % gas.length];      if (current < 0) {        return -1;      }    }    return current;  };  for (let i = 0; i < gas.length; i ++) {    if (gas[i] > cost[i]) {      if (search(i) >= 0) {        return i;      }    }  }  return -1;};
/** * @param {number[]} bills * @return {boolean} */var lemonadeChange = function(bills) {  let five = 0, ten = 0, twenty = 0;  for (let i = 0; i < bills.length; i++) {    if (bills[i] === 5) {      five += 1;    } else if (bills[i] === 10) {      if (five === 0) {        return false;      }      five -= 1;      ten += 1;    } else if (bills[i] === 20) {      if (ten === 0) {        if (five < 3) {          return false;        }        five -= 3;      } else if (ten > 0) {        if (five < 1) {          return false;        }        ten -= 1;        five -= 1;        twenty += 1;      }    }  }  return true;};
/** * @param {number[]} rowSum * @param {number[]} colSum * @return {number[][]} */var restoreMatrix = function(rowSum, colSum) {  const r = rowSum.length;  const c = colSum.length;  const m = new Array(r);  for (let i = 0; i < r; i++) {    m[i] = new Array(c).fill(0);    for (let j = 0; j < c; j++) {      m[i][j] = Math.min(rowSum[i], colSum[j]);      rowSum[i] -= m[i][j];      colSum[j] -= m[i][j];    }  }  return m;};
/** * @param {string} s * @return {string} */var reorganizeString = function(s) {  if (s.length === 1) {    return s;  }  let counts = {};  for (let i = 0; i < s.length; i++) {    const c = s.charAt(i);    counts[c] = counts[c] || 0;    counts[c] += 1;  }  counts = Object.entries(counts);  counts.sort((a, b) => b[1] - a[1]);  let maxChar = counts.shift();  let ans = [], maxrow = maxChar[1];  if (maxrow > (( 1 + s.length) >> 1)) return '';  for (let i = 0; i < maxrow; i++) {    ans[i] = [maxChar[0]];  }  let row = 0;  while(counts.length) {    let [c, max] = counts.shift();    for (let j = 0; j < max; j++, row++) {      ans[row % maxrow].push(c);    }  }  // console.log(ans);  const r = ans.map(item => item.join('')).join('');  return r;};