319. 灯泡开关(JS实现)

319. 灯泡开关(JS实现)
1 题目
初始时有 n 个灯泡关闭。 第 1 轮,你打开所有的灯泡。 第 2 轮,每两个灯泡你关闭一次。 第 3 轮,每三个灯泡切换一次开关(如果关闭则开启,如果开启则关闭)。第 i 轮,每 i 个灯泡切换一次开关。 对于第 n 轮,你只切换*后一个灯泡的开关。 找出 n 轮后有多少个亮着的灯泡。
示例:
输入: 3
输出: 1
解释:
初始时, 灯泡状态 [关闭, 关闭, 关闭].
*轮后, 灯泡状态 [开启, 开启, 开启].
第二轮后, 灯泡状态 [开启, 关闭, 开启].
第三轮后, 灯泡状态 [开启, 关闭, 关闭].
你应该返回 1,因为只有一个灯泡还亮着。
链接:https://leetcode-cn.com/problems/bulb-switcher
2 思路
仔细观察,可以看出规律只有完全平方数索引处的灯泡还亮着,即1,4,9等。。。
3代码
/**
 * @param {number} n
 * @return {number}
 */
var bulbSwitch = function(n) {
    return Math.floor(Math.sqrt(n));
};

13. 超级丑数(JS实现)

13. 超级丑数(JS实现)
1 题目
编写一段程序来查找第 n 个超级丑数。
超级丑数是指其所有质因数都是长度为 k 的质数列表 primes 中的正整数。
示例:
输入: n = 12, primes = [2,7,13,19]
输出: 32
解释: 给定长度为 4 的质数列表 primes = [2,7,13,19],前 12 个超级丑数序列为:[1,2,4,7,8,13,14,16,19,26,28,32] 。
说明:
1 是任何给定 primes 的超级丑数。
给定 primes 中的数字以升序排列。
0 < k ≤ 100, 0 < n ≤ 106, 0 < primes[i] < 1000 。
第 n 个超级丑数确保在 32 位有符整数范围内。
链接:https://leetcode-cn.com/problems/super-ugly-number
2 思路
这道题和之前丑数二有点类型,区别在于这里的质数数组为输入参数,而不再是固定的了,但本质上不变,在原来的动态规划的基础上增加一个循环即可
3代码
/**
 * @param {number} n
 * @param {number[]} primes
 * @return {number}
 */
var nthSuperUglyNumber = function(n, primes) {
    const res = [1];
    let p = [];
    for (let i=0;i<primes.length;i++){   //初始化指针
        p.push(0);
    }
    let prev;
    let minIndex = 0;
    while(res.length < n) {
        let min = res[p[minIndex]] * primes[minIndex];  //初始化*小值
        for (let i=0;i<primes.length;i++){    //循环比较获取当前*小乘积
            let num = res[p[i]] * primes[i];
            min = Math.min(min, num);
            if (min === num) minIndex = i;
        }
        if (prev !== min) res.push(min);     //用于去重
        prev = min;
        p[minIndex]++;
    }
    return res[res.length – 1];
};

328. 奇偶链表(JS实现)

328. 奇偶链表(JS实现)
1 题目
给定一个单链表,把所有的奇数节点和偶数节点分别排在一起。请注意,这里的奇数节点和偶数节点指的是节点编号的奇偶性,而不是节点的值的奇偶性。
请尝试使用原地算法完成。你的算法的空间复杂度应为 O(1),时间复杂度应为 O(nodes),nodes 为节点总数。
示例 1:
输入: 1->2->3->4->5->NULL
输出: 1->3->5->2->4->NULL
示例 2:
输入: 2->1->3->5->6->4->7->NULL
输出: 2->3->6->7->1->5->4->NULL
说明:
应当保持奇数节点和偶数节点的相对顺序。
链表的*个节点视为奇数节点,第二个节点视为偶数节点,以此类推。
链接:https://leetcode-cn.com/problems/odd-even-linked-list
2 思路
这道题我的思路*遍遍历,我给每个节点添加一个_next指针,奇数节点指向下一个奇数节点,而偶数节点指向下一个偶数节点,第二次遍历将_next替换为原来的next指针
3代码
/**
 * Definition for singly-linked list.
 * function ListNode(val, next) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.next = (next===undefined ? null : next)
 * }
 */
/**
 * @param {ListNode} head
 * @return {ListNode}
 */
var oddEvenList = function(head) {
    if (!head || !head.next) return head;
    let link = head;
    let headOdd = head;
    let headEven = secondNode = head.next;
    let lastOddNode;
    while(headOdd || headEven) {
        if (headOdd) {
            headOdd._next = (headOdd.next && headOdd.next.next) || null;
            if (!headOdd._next) {
                lastOddNode = headOdd;
            }
            headOdd = headOdd._next;
        }
        if (headEven) {
            headEven._next = (headEven.next && headEven.next.next) || null;
            headEven = headEven._next;
        }
    }
    while(head) {
        let nextNode = head.next;
        head.next = head._next;
        delete head._next;
        head = nextNode;
    }
    lastOddNode.next = secondNode;
    return link;
};

PHP的exec()函数无返回值排查方法

在安全imagemagic时 需要用到 exec很多服务器上安装失败

exec()执行外部命令失败,但没有任何错误信息。

exec执行某命令在命令行下没有问题,但是在php中就出错。这个问题99.99%与权限有关,但是exec执行的命令不会返回错误。一个技巧就是使用管道命令,假设你的exec调用如下:

exec('convert a.jpg b.jpg', $output, $return_val);

可以更改如下:

  1. exec(‘convert a.jpg b.jpg 2>&1’, $output, $return_val);
  2. print_r($output);

使用 2>&1 , 命令就会输出shell执行时的错误到$output变量, 输出该变量即可分析。

备注: exec有3个参数,*个是要执行的命令,第二个是参数是一个数组,数组的值是由*个命令执行后生成的,第三个参数执行的状态,0表示成功,其他都表示失败。

在php里面一共有三个函数可以用来执行外部命令system,exec,passthru。

php执行shell,返回空

问题:以下shell脚本在 www 用户下执行 sudo /usr/local/webserver/nginx/sbin/nginx -t 是有返回结果的,但用http://localhost/nginx.php?act=test 访问是看不到返回值,shell指令都没执行,safe-mode 是off的,不知为何,请教高人了?
nginx.php代码如下:
<?php
if(isset($_GET[‘act’])&&!empty($_GET[‘act’])){
if($_GET[‘act’]==’test’){
$message=shell_exec(“sudo /usr/local/webserver/nginx/sbin/nginx -t”);
echo “测试结果:”.$message;
}elseif($_GET[‘act’]==’restart’){
$message=shell_exec(“sudo /usr/local/webserver/nginx/sbin/nginx -s reload”)
;
echo “重启结果:”.$message;
}
}else{
header(“Status: 404 Not Found”);
}
?>

回复:我一开始也为这个问题迷惑不解,为何 php cgi以www用户执行sudo ls -al / 命令就可以正常输出,而执行

sudo /usr/local/webserver/nginx/sbin/nginx -t 却没有输出?

没有任何输出,导致我们无法跟踪错误的原因,那么,使用Linux标准输出重定向,看看有无输出,我的php代码是(设置/wwwroot/log.txt权限为777):
/wwwroot/index.php
<?php
$s = shell_exec(“/usr/bin/sudo /home/nginx/sbin/nginx -t >/wwwroot/log.txt”);
echo $s;

请求http://localhost/index.php, 发现log.txt文件是空白的,即没有正常输出,那说明有可能发生了错误,为此,我再尝试使用Linux的标准错误输出重定向:
$s = shell_exec(“/usr/bin/sudo /home/nginx/sbin/nginx -t 2>/wwwroot/log.txt”);

注意重定向符号前的2

再请求index.php 这时,在log.txt中记录了详细的错误:
sudo: sorry, you must have a tty to run sudo

这个错误我没见过,大致意思说,当执行sudo时,必须要从终端登录(可能nginx本身的一些限制)

google搜索这个错误提示, 解决办法也很简单:
注释掉 /etc/sudoers中 ‘Defaults requiretty’ 这个就行,即前面加#

按这个办法处理,浏览器仍然没有任何输出,我的猜测:可能是nginx启动程序输出目标是终端,那么折衷的办法就是使用输出重定向了,所以,改造的代码如下:
index.php
<?php
$trace=”/wwwroot/log.txt”;

if(!is_writable($trace) || !is_readable($trace)) {
exit(“$trace must readable and writable”);
}

file_put_contents($trace,”);

echo `/usr/bin/sudo /home/nginx/sbin/nginx -t >$trace 2>&1`;

echo `top -b -n 1`;
echo file_get_contents($trace);

这是通过简接方式来观察输出的,类似这个现象的,还有使用top命令查看系统负载,top命令需要在终端窗口中执行,使用php执行shell_exec(“top -n 1”),给出的错误就是TERM environment variable not set. 解决办法就是使用-b参数执行top, 即shell_exec(“top -b -n 1”)

如果你有更好的方法,欢迎一起探讨,如果实验成功,也就可以通过web页面控制nginx了。

324. 摆动排序 II(JS实现)

324. 摆动排序 II(JS实现)
1 题目
给定一个无序的数组 nums,将它重新排列成 nums[0] < nums[1] > nums[2] < nums[3]… 的顺序。
示例 1:
输入: nums = [1, 5, 1, 1, 6, 4]
输出: 一个可能的答案是 [1, 4, 1, 5, 1, 6]
示例 2:
输入: nums = [1, 3, 2, 2, 3, 1]
输出: 一个可能的答案是 [2, 3, 1, 3, 1, 2]
说明:
你可以假设所有输入都会得到有效的结果。
进阶:
你能用 O(n) 时间复杂度和 / 或原地 O(1) 额外空间来实现吗?
链接:https://leetcode-cn.com/problems/wiggle-sort-ii
2 思路
很明显,我做这道题就是先把数组排序,然后将数组分为两部分,依次构造新数组的,题解中有O(n)的算法,其先用快速选择法,找到数组的中位数,然后将小于等于中位数的数放置在左侧,大于中位数的放置在右侧,这样就成了两部分了
3代码
/**
 * @param {number[]} nums
 * @return {void} Do not return anything, modify nums in-place instead.
 */
var wiggleSort = function(nums) {
  nums.sort((a,b) => a-b);
  let mid = nums.length % 2 === 0 ? Math.floor(nums.length / 2) : Math.floor(nums.length / 2) + 1;
  const res = [];
  let low = mid – 1;
  let high = nums.length – 1;
  while (low >= 0 && high >= mid) {
    res.push(nums[low–]);
    res.push(nums[high–]);
  }
  if (low >= 0) res.push(nums[low–]);   //从后向前进行插入
  if (high >= mid) res.push(nums[high–]);  //从后向前进行插入
  for (let i=0; i<res.length;i++) {
    nums[i] = res[i];
  }
};

322. 零钱兑换(JS实现)

322. 零钱兑换(JS实现)
1 题目
给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的*少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回 -1。
示例 1:
输入: coins = [1, 2, 5], amount = 11
输出: 3
解释: 11 = 5 + 5 + 1
示例 2:
输入: coins = [2], amount = 3
输出: -1
链接:https://leetcode-cn.com/problems/coin-change
2 思路
这道题考察贪心+回溯算法,我们先把硬币排序,然后构造一棵树,先从大面值的硬币开始,逐级相减,直到总金额为0,即找到了目标的*优组合,题解中还可以用动态规划的方法来做
3代码
/**
 * @param {number[]} coins
 * @param {number} amount
 * @return {number}
 */
var coinChange = function(coins, amount) {
  coins.sort((a,b) => a-b);
  if (amount === 0) return 0;
  if (amount < coins[0]) return -1;
  let ans = 999999;
  d(amount, coins.length – 1, 0, coins);
  function d(num, index, len, coins) {
    if (num === 0) {
      ans = Math.min(ans, len);
      return;
    };
    if (index < 0) return;
    for (let k=Math.floor(num / coins[index]); k >=0 && k + len < ans; k–) {
        d(num – coins[index] * k, index – 1, len + k, coins);
    }
  }
  return ans === 999999 ? -1 : ans;
};

1016. 部分A+B (15)

1016. 部分A+B (15)
时间限制
100 ms
内存限制
65536 kB
代码长度限制
8000 B
判题程序
Standard
作者
CHEN, Yue
正整数A的“DA(为1位整数)部分”定义为由A中所有DA组成的新整数PA。例如:给定A = 3862767,DA = 6,则A的“6部分”PA是66,因为A中有2个6。
现给定A、DA、B、DB,请编写程序计算PA + PB。
输入格式:
输入在一行中依次给出A、DA、B、DB,中间以空格分隔,其中0 < A, B < 1010。
输出格式:
在一行中输出PA + PB的值。
输入样例1:
3862767 6 13530293 3
输出样例1:
399
输入样例2:
3862767 1 13530293 8
输出样例2:
0
n=input().split()
a=n[0]
a1=n[1]
b=n[2]
b1=n[3]
A=a.count(a1)
B=b.count(b1)
if A==0:
    s1=’0′
else:
    s1=A*a1
if B==0:
    s2=’0′
else:
    s2=B*b1
print(int(s1)+int(s2))

1061. 判断题(15) python篇

1061. 判断题(15) python篇
1061. 判断题(15)
时间限制
400 ms
内存限制
65536 kB
代码长度限制
8000 B
判题程序
Standard
作者
CHEN, Yue
判断题的评判很简单,本题就要求你写个简单的程序帮助老师判题并统计学生们判断题的得分。
输入格式:
输入在*行给出两个不超过100的正整数N和M,分别是学生人数和判断题数量。第二行给出M个不超过5的正整数,是每道题的满分值。第三行给出每道题对应的正确答案,0代表“非”,1代表“是”。随后N行,每行给出一个学生的解答。数字间均以空格分隔。
输出格式:
按照输入的顺序输出每个学生的得分,每个分数占一行。
输入样例:
3 6
2 1 3 3 4 5
0 0 1 0 1 1
0 1 1 0 0 1
1 0 1 0 1 0
1 1 0 0 1 1
输出样例:
13
11
12
l1=input().split()
l2=input().split()
l3=input().split()
b=0
c=[]
for i in range(int(l1[0])):
    a=input().split()
    for x,y in enumerate(a):
        if y==l3[x]:
            b = b + int(l2[x])
    c.append(b)
for i in c:
    print(i)

linux下php获取shell命令返回数据

获取cpu使用率:

例:
sensor.php:

<?php
exec(“top -b -n 1|grep CPU|grep -v grep|awk ‘{if(NR==1){print $8}}'”,$output);
$tmp = $output[0];
$output = array();
echo $output;

?>

%title插图%num

注:$output为获取标准输出的数组,每次循环会累加到数据中,所有进行了数组清空:
$output = array();
所以,每次数据都为*新数据存放于数组首元素中。