每周算法5

1.二进制求和
/**
 * @param {string} a
 * @param {string} b
 * @return {string}
 */
var addBinary = function(a, b) {
    let L = a.length-1;
    let R = b.length-1;
    let sum=0,t=0;
    let str = ''
    while(L>=0||R>=0){
      let s1 = a[L]?(a[L]-'0'):0
      let s2 = b[R]?(b[R]-'0'):0
      sum = s1+s2+t;
      if(sum==0){
        str+='0'
      }else if(sum==1){
        str+=sum%2
        t=Math.floor(sum/2)
      }else if(sum>=2){
        t=Math.floor(sum/2)
        str+=sum%2
      }
      L--
      R--
    }
    if(t!=0){
      str+='1'
    }
    return str.split('').reverse().join('')
};

2.x的平方根
/**
 * @param {number} x
 * @return {number}
 */
var mySqrt = function(x) {
  if(x==0) return 0
  if(x==1) return 1
  if(x==2) return 1
  if(x==3) return 1
  if(x==5) return 2

  for(let i=1;i<=Math.floor(x/2);i++){
    if(i*i==x){
      return i  
    }
    if(i*i>x){
      return i-1
    }
  }
};
3.Excel表列名称
/**
 * @param {number} n
 * @return {string}
 */
var convertToTitle = function(n) {
  let obj = {0:'Z',1:'A',2:'B',3:'C',4:'D',5:'E',6:'F',7:'G',8:'H',9:'I',10:'J',11:'K',12:'L',13:'M',14:'N',
             15:'O',16:'P',17:'Q',18:'R',19:'S',20:'T',21:'U',22:'V',23:'W',24:'X',25:'Y'}
  let arr = []
  let t
  while(n){
    arr.unshift(obj[n%26])
    if(n%26==0){
      t=Math.floor(n/26)-1
    }else{
      t=Math.floor(n/26)
    }
    n=t
  }
  return arr.join("")
};
3.Excel表列序号
/**
 * @param {string} s
 * @return {number}
 */
var titleToNumber = function(s) {
  let len = s.length
  let sum = 0
  for(let i=0;i<len;i++){
    sum += Math.pow(26,len-(i+1))*(s[i].charCodeAt()-64)
  }
  return sum
};
4.阶乘后的零
/**
 * @param {number} n
 * @return {number}
 */
var trailingZeroes = function(n) {
  let res = 0
  while(n>=5){
    n = Number.parseInt(n/5)
    res+=n
  }
  return res
};
5.快乐数

思路:

  • 最终会得到1.(返回true)
  • 最终会进入循环(返回false)
  • 找出过程中重复的数字避免进入无限循环,如果出现了重复的数字说明不是快乐数字,返回false,否则返回true。
/**
 * @param {number} n
 * @return {boolean}
 */

var isHappy = function(n) {
    const bitSquareSum = (x)=>{
      let sum=0,cur
      while (x>0) {
        cur = x%10
        sum+=cur*cur
        x=Math.floor(x/10)
      }
      return sum
    }
    let s = new Set()
    while(n!=1){
      s.add(n)
      n = bitSquareSum(n)
      if(s.has(n)){
        return false
      }
    }
    return true
};
6.计算质数
/**
 * @param {number} n
 * @return {number}
 */
var countPrimes = function(n) {
  const isPrimes = (x)=>{
    if(x<3){
      return x>1
    }
    for(let i=2;i<=Math.sqrt(x);i++){
      if(x%i==0) return false
    }
    return true
  }
  let res = 0
  for(let i=1;i<n;i++){
    if(isPrimes(i)){
      res++
    }
  }
  return res
};
7.2的幂
  • 位运算
/**
 * @param {number} n
 * @return {boolean}
 */
var isPowerOfTwo = function(n) {
  if(n<0) return false
  let count = 0
  while(n){
    if((n & 0x1)==1) count++
    if(count>=2) return false
    n>>=1
  }
  if(count==0) return false
  return true
};
8.各位相加
/**
 * @param {number} num
 * @return {number}
 */
var addDigits = function(num) {
  let sum=0
  while(num){
    sum += num%10
    num = Math.floor(num/10)
    if(num<=0){
      if(sum<10){
        return sum
      }
      num=sum
      sum=0
    }
  }
  return sum
};
9.丑数
/**
 * @param {number} num
 * @return {boolean}
 */

var isUgly = function(num) {
  if(num<1) return false
  while(num%2===0) num/=2
  while(num%3===0) num/=3
  while(num%5===0) num/=5
  return num==1
};
10.丢失的数字
/**
 * @param {number[]} nums
 * @return {number}
 */
var missingNumber = function(nums) {
  nums.sort((a,b)=>a-b)
  for(let i=0;i<=nums.length;i++){
    if(i!=nums[i]){
      return i
    }
  }
};
11.3的幂
/**
 * @param {number} n
 * @return {boolean}
 */
var isPowerOfThree = function(n) {
  let i=0,m
  while((m=Math.pow(3,i++))<n){}
  return m===n
};
12.有效的完全平方数
/**
 * @param {number} num
 * @return {boolean}
 */
var isPerfectSquare = function(num) {
  let i=1
  while(i*i<num){
    i++
  }
  return i*i===num
};
12.排列硬币
/**
 * @param {number} n
 * @return {number}
 */
var arrangeCoins = function(n) {
  let i=1,sum=0
  while(sum<n){
    sum+=i
    i++
  }
  if(sum==n){
    return i-1
  }
  if(sum>n){
    return i-2
  }
};
13.最小移动次数使数组元素相等
/**
 * @param {number[]} nums
 * @return {number}
 */
var minMoves = function (nums) {
  let min = Math.min(...nums)
  let res = 0
  for(let i=0;i<nums.length;i++){
    res+=nums[i]-min
  }
  return res
};
14.构造矩形
/**
 * @param {number} area
 * @return {number[]}
 */
var constructRectangle = function(area) {
  let res = [area,1]
  for(let i=Math.floor(Math.sqrt(area));i<=area;i++){
    if(area%i==0){
      let W = Math.floor(area/i)
      if(((res[0]-res[1])>i-W)&&(i-W>=0)){
        res=[i,W]
      }
    }
  }
  return res
};
15.完美数
/**
 * @param {number} num
 * @return {boolean}
 */
var checkPerfectNumber = function(num) {
  if(num<=0) return false
  let sum=0
  for(let i=0;i*i<=num;i++){
    if(num%i === 0){
      sum+=i
      if(i*i!=num){
        sum+=num/i
      }
    }
  }
  return sum-num==num
};
16.范围求和 II
/**
 * @param {number} m
 * @param {number} n
 * @param {number[][]} ops
 * @return {number}
 */
var maxCount = function(m, n, ops) {
  if(ops.length==0){
    return m*n
  }
  ops.sort((a,b)=>a[0]-b[0])
  let minX = ops[0][0]
  ops.sort((a,b)=>a[1]-b[1])
  let minY = ops[0][1]
  return minX*minY
};
17.三个数的最大乘积
/**
 * @param {number[]} nums
 * @return {number}
 */
var maximumProduct = function(nums) {
  let len = nums.length
  if(len===3) return nums[0]*nums[1]*nums[2];
  nums.sort((a,b)=>a-b);
  let sum2= nums[len-1]*nums[len-2]*nums[len-3];
  if(nums[1]>0){
    return sum2
  }
  let sum1=nums[0]*nums[1]*nums[len-1]
  if(sum1>=sum2){
    return sum1
  }else{
    return sum2
  }
};
18.错误的集合
/**
 * @param {number[]} nums
 * @return {number[]}
 */
var findErrorNums = function (nums) {
  let len = nums.length
  nums.sort((a, b) => a - b);
  let res = [];
  for (let i = 0; i < len - 1; i++) {
    if (nums[i] == nums[i + 1]) {
      res.push(nums[i]);
      nums.splice(i, 1);
      break;
    }
  }
  for (let i = 0; i < len; i++) {
    if (nums[i] !== i + 1) {
      res.push(i + 1)
      break;
    }
  }
  if(res.length==1) res.push(1)
  return res
};
19.自除数
/**
 * @param {number} left
 * @param {number} right
 * @return {number[]}
 */
var selfDividingNumbers = function(left, right) {
  let res = [],arr=[]
  for(let i=left;i<=right;i++){
    let str = i+""
    res.push(i);
    for(let j=0;j<str.length;j++){
      if(i%parseInt(str[j])!==0){
        res.splice(arr.indexOf(i),1)
        break
      }
    }
  }
  return res
};
20.最大三角形面积
/**
 * @param {number[][]} points
 * @return {number}
 */
var largestTriangleArea = function(points) {
  let number = -1;
    for(let i of points)
        for(let j of points)
            for(let k of points)
                number = Math.max(number,(i[0]*j[1] + j[0]*k[1] + k[0]*i[1] - (i[1]*j[0] + j[1]*k[0] + k[1]*i[0]))/2);
    return number;
};
这是一个比较复杂的算法,需要考虑多个因素,如班级数量、每个班级的课程数、每周可用的教室和时间段等等。以下是一个简单的 PHP 代码示例,可以作为一个思路参考: ```php // 定义班级和课程信息 $classes = array( 'class1' => array('course1', 'course2', 'course3'), 'class2' => array('course1', 'course4', 'course5'), 'class3' => array('course2', 'course3', 'course5') ); // 定义可用的教室和时间段 $rooms = array('room1', 'room2', 'room3'); $timeSlots = array('Monday 8:00-10:00', 'Monday 10:00-12:00', 'Tuesday 8:00-10:00', 'Tuesday 10:00-12:00', 'Wednesday 8:00-10:00', 'Wednesday 10:00-12:00', 'Thursday 8:00-10:00', 'Thursday 10:00-12:00', 'Friday 8:00-10:00', 'Friday 10:00-12:00'); // 定义排课结果 $schedule = array(); // 循环班级和课程 foreach ($classes as $class => $courses) { // 每个班级每门课程需要排几节课 $numCourses = count($courses); $numLessons = ceil($numCourses / count($timeSlots)); // 按时间段循环排课 $i = 0; foreach ($timeSlots as $timeSlot) { // 每个时间段随机选择一个可用的教室 $room = $rooms[array_rand($rooms)]; // 循环排课,直到排完所有课程 for ($j = 0; $j < $numLessons; $j++) { if ($i >= $numCourses) break; $schedule[] = array( 'class' => $class, 'course' => $courses[$i], 'room' => $room, 'time' => $timeSlot ); $i++; } } } // 输出排课结果 foreach ($schedule as $lesson) { echo $lesson['class'] . ' ' . $lesson['course'] . ' ' . $lesson['room'] . ' ' . $lesson['time'] . '<br>'; } ``` 这段代码仅仅是一个简单的示例,实际应用中需要根据具体情况对代码进行修改和优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值