分页: 1 / 2

四则运算 腾讯面试题

发表于 : 2011-11-13 16:21
zhi5631
2.编写一个名为cala的shell过程,其功能是小型计算器,可以进行两数加、减、乘、除运算。两操作数和运算符由位置参数给出(位置参数1和3分别是两操作数,位置参数2是运算符),并将四种运行结果追加存入cal文件中。

代码: 全选

#!/bin/bash

Usage(){ echo "param err"; exit -1;}
[ $# -ne 3 ] &&  Usage

echo '+-*/' | grep "$2" >/dev/null 2>&1
[ $? -ne 0 ] && Usage

e="awk -v p1=$1 -v p2=$3 "
#b="ENG { close(\"cal\") }"
b=" close(\"cal\")"
case $2 in 
    '+')
        s="$e 'BEGIN { print p1 + p2 >> \"cal\"; $b}'"
        ;;
    '-')
        s="$e 'BEGIN {print p1 - p2 >> \"cal\"; $b}'"
        ;;
    '*')
        s="$e 'BEGIN { print p1 '*' p2 >> \"cal\"; $b}'"
        ;;
    '/')
        s="$e 'BEGIN { print p1 / p2 >>\"cal\"; $b}'"
        ;;
    *)
        echo "case err"
        ;;
esac

echo $s

eval $s

闲来无事,找了个腾讯面试题做作,请赐教。

Re: 四则运算 腾讯面试题

发表于 : 2011-11-13 17:07
zhi5631
4.腾讯一shell试题.
假设qq.tel文件内容:
12334:13510014336
12345:12334555666
12334:12343453453
12099:13598989899
12334:12345454545
12099:12343454544
分类如下:
[12334]
13510014336
12343453453
...........
[12099]
13598989899
12343454544
............

代码: 全选

wuya@wuya:~/test$ cat cal 
BEGIN {
    FS = ":"
}

{
    w[$1] = w[$1] ":"  $2
}

END{
    for (i in w){
        printf "[%s]", i
        n = split(w[i], a, ":")
        j = 1
        while(j < n){
            printf "\t%s\n", a[j]
            j++
        }
    }
}

代码: 全选

wuya@wuya:~/test$ awk -f cal test
[12334]	
	13510014336
	12343453453
[12099]	
	13598989899
[12345]	


Re: 四则运算 腾讯面试题

发表于 : 2011-11-13 17:10
zhi5631
11.说明一下/proc/sys子目录的作用
答:该子目录的作用是报告各种不同的内核参数,并让你能交互的更改其中某些。与/proc中所有
其他文件不同,该目录中的某些文件可以写入,不过针对root。一下是该子目录的两个最常见
的用途:
(1)允许路由:即便是Mandrakelinux 默认的内核也是允许路由的。你必须显式允许它这么做
为此:#echo 1 >/proc/sys/net/ipv4/ip_forward.
如果您要禁用,则让上述1改为0
(2)阻止ip欺骗:ip欺骗会让人认为某个来自于外部的某个数据包来自于它到达的那个接口,
这一技术常被crack利用。你可以阻止这种入侵:
#echo 1 >/proc/sys/net/ipv4/conf/all/rp_filter.
这次改变仅由系统运行时有效,系统重启后,会改变为默认值。你可以将以上命令添加到
/etc/rc.d/rc.local中,启动就会运行。另一方法:修改/etc/sysctl.conf

Re: 四则运算 腾讯面试题

发表于 : 2011-11-13 17:15
zhi5631
7.比如,ext2文件系统,如果异常死机,开机如何修复文件系统?
答:如果异常死机,如断电,通知机房的人开机之后,我们需要远程修复,检查文件系统。除了
/ 分区之外,其他分区:umount /home
fsck -y /home
/ 分区需要开机之后由机房人员检查。随后我们登录并扫描/home分区
8.如何检查一个进程所使用的文件句柄?
答:看这里面/proc/进程号/fd/ 的文件个数就行了
9.查看Apache的进程数。
# ps -ef|grep httpd|wc -l
10.如何统计apache的每秒访问数?
tail access_log|awk '{print $1,$4}'
其中文件在:/etc/httpd/access_log

Re: 四则运算 腾讯面试题

发表于 : 2011-11-13 18:03
zhi5631
5.如果得到随机的字串,长度和字串中出现的字符表可定义并将字串倒序显示,如把0123456789作为基准的
字串字符表,产生一个6位的字串642031,打印出的字符串为130246,可使用bash/perl/php/c任一种。

代码: 全选

wuya@wuya:~/test$ echo "" | awk -v len=6 -v str="1234567890" -f test 
before: 6 1234567890
733366
663337

代码: 全选

wuya@wuya:~/test$ cat test
BEGIN{
    srand()
}

{
    printf "before: %d %s\n", len, str;
    strlen = length(str)
    for (i = 1; i <= strlen; i++)
        s[i] = substr(str, i, 1)
    i = 1
    while( i <= len){
        tmp = int(rand() * strlen)
        #printf "%d %s\n", tmp, s[tmp]
        if(s[tmp])
            rand_str = rand_str s[tmp]
        else
            rand_str = rand_str "0"
        i++
    }

    #print rand_str
}

END{
    print rand_str
    i = len
    flag = 0
    while(1){
        printf "%c", substr(rand_str, i, 1)
        --i
        if(flag == 1)
            break
        if (i == 1){
            flag = 1
        }
    }
    print
}


Re: 四则运算 腾讯面试题

发表于 : 2011-11-13 18:04
月下叹逍遥
flash算不算? :em03

Re: 四则运算 腾讯面试题

发表于 : 2011-11-13 18:07
zhi5631
月下叹逍遥 写了:flash算不算? :em03
什么意思? 没懂?

Re: 四则运算 腾讯面试题

发表于 : 2011-11-13 18:11
zhi5631
处理一下文件内容,将域名取出并进行计数排数,如处理:

代码: 全选

http://www.baidu.com/index.html
http://ww.baidu.com/1.html
http://www.baidu.com/2.html
http://post.baidu.com/index.html
http://mp3.baidu.com/index.html
http://www.baidu.com/3.html
http://post.baidu.com/2.html

代码: 全选

wuya@wuya:~/test$ cat test | cut -d'/' -f 3 | sort | uniq -c
      1 mp3.baidu.com
      2 post.baidu.com
      1 ww.baidu.com
      3 www.baidu.com

Re: 四则运算 腾讯面试题

发表于 : 2011-11-13 20:48
fnan
zhi5631 写了:5.如果得到随机的字串,长度和字串中出现的字符表可定义并将字串倒序显示,如把0123456789作为基准的
字串字符表,产生一个6位的字串642031,打印出的字符串为130246,可使用bash/perl/php/c任一种。

代码: 全选

wuya@wuya:~/test$ echo "" | awk -v len=6 -v str="1234567890" -f test 
before: 6 1234567890
733366
663337

代码: 全选

wuya@wuya:~/test$ cat test
BEGIN{
    srand()
}

{
    printf "before: %d %s\n", len, str;
    strlen = length(str)
    for (i = 1; i <= strlen; i++)
        s[i] = substr(str, i, 1)
    i = 1
    while( i <= len){
        tmp = int(rand() * strlen)
        #printf "%d %s\n", tmp, s[tmp]
        if(s[tmp])
            rand_str = rand_str s[tmp]
        else
            rand_str = rand_str "0"
        i++
    }

    #print rand_str
}

END{
    print rand_str
    i = len
    flag = 0
    while(1){
        printf "%c", substr(rand_str, i, 1)
        --i
        if(flag == 1)
            break
        if (i == 1){
            flag = 1
        }
    }
    print
}

#越复杂越好吗?
len=6;grep -o '.' <<<'1234567890'|shuf -n $len|tr -d '\n'|rev
#好像搞错了,应该是len长度不限的:
len=10;str='abcdefg';c=($(grep -o '.' <<<$str));while((len-->=1));do printf ${c[$(($RANDOM%${#c[*]}))]};done|rev

Re: 四则运算 腾讯面试题

发表于 : 2011-11-14 8:11
zhi5631
fnan 写了:
zhi5631 写了:5.如果得到随机的字串,长度和字串中出现的字符表可定义并将字串倒序显示,如把0123456789作为基准的
字串字符表,产生一个6位的字串642031,打印出的字符串为130246,可使用bash/perl/php/c任一种。

代码: 全选

wuya@wuya:~/test$ echo "" | awk -v len=6 -v str="1234567890" -f test 
before: 6 1234567890
733366
663337

代码: 全选

wuya@wuya:~/test$ cat test
BEGIN{
    srand()
}

{
    printf "before: %d %s\n", len, str;
    strlen = length(str)
    for (i = 1; i <= strlen; i++)
        s[i] = substr(str, i, 1)
    i = 1
    while( i <= len){
        tmp = int(rand() * strlen)
        #printf "%d %s\n", tmp, s[tmp]
        if(s[tmp])
            rand_str = rand_str s[tmp]
        else
            rand_str = rand_str "0"
        i++
    }

    #print rand_str
}

END{
    print rand_str
    i = len
    flag = 0
    while(1){
        printf "%c", substr(rand_str, i, 1)
        --i
        if(flag == 1)
            break
        if (i == 1){
            flag = 1
        }
    }
    print
}

#越复杂越好吗?
len=6;grep -o '.' <<<'1234567890'|shuf -n $len|tr -d '\n'|rev
#好像搞错了,应该是len长度不限的:
len=10;str='abcdefg';c=($(grep -o '.' <<<$str));while((len-->=1));do printf ${c[$(($RANDOM%${#c[*]}))]};done|rev

代码: 全选

学习了,  我一直都认为能实现相同的功能代码越少越好。

知识点:
1. rev: reverse lines of a file or files
2. shuf: 把输入行按随机顺序输出到标准输出。
    -n, --head-count=行数		最多输出指定的行数
3. echo $(($RANDOM % 3)) 生成随机数

求教: grep -o '.' <<< "1234567890"  这里<<<是什么语法,没见过这个,我只知道here文档及<<.

Re: 四则运算 腾讯面试题

发表于 : 2011-11-14 8:41
枫叶饭团
运维考试?狗日的腾迅

Re: 四则运算 腾讯面试题

发表于 : 2011-11-14 8:44
zhi5631
Linux下判断内存使用的一些方法和说明:
http://blog.csdn.net/jiafu1115/article/details/6640352

???干吗要骂人家。

Re: 四则运算 腾讯面试题

发表于 : 2011-11-14 9:05
zhi5631

Re: 四则运算 腾讯面试题

发表于 : 2011-11-14 20:53
fnan
求教: grep -o '.' <<< "1234567890" 这里<<<是什么语法,没见过这个,我只知道here文档及<<.
#变量引用,或者说直接引用内容。

Re: 四则运算 腾讯面试题

发表于 : 2011-11-14 21:05
fnan
zhi5631 写了:4.腾讯一shell试题.
假设qq.tel文件内容:
12334:13510014336
12345:12334555666
12334:12343453453
12099:13598989899
12334:12345454545
12099:12343454544
分类如下:
[12334]
13510014336
12343453453
...........
[12099]
13598989899
12343454544
............

代码: 全选

wuya@wuya:~/test$ cat cal 
BEGIN {
    FS = ":"
}

{
    w[$1] = w[$1] ":"  $2
}

END{
    for (i in w){
        printf "[%s]", i
        n = split(w[i], a, ":")
        j = 1
        while(j < n){
            printf "\t%s\n", a[j]
            j++
        }
    }
}

代码: 全选

wuya@wuya:~/test$ awk -f cal test
[12334]	
	13510014336
	12343453453
[12099]	
	13598989899
[12345]	

sort qq.tel|awk -F: '{if (n!=$1) print "["$1"]\n"$2;else print $2;n=$1}'