程序员老鬼

我把领导的私密聊天记录同步到了全员群,结果.. ,领导当天就被老板约谈,我以为自己要被开除,结果领导硬扛了下来~

我把领导和同事私聊里那段“对公司有点小情绪、顺便提了下想换环境”的内容,手滑同步进了500人的全员群。

Image

你能想象那一秒的安静吗?感觉全世界都静音了。

网友们后来在评论区笑疯了:有人说“恭喜你,完成了年度最大规模转发”;还有人补刀“这叫企业级广播事故”

当天领导被叫去聊,我在工位上像跑着死循环的程序,脑子一直报错。

没想到领导回来没炸,扛下来了,只私下跟我说:职场里有些错,一次就够了。那一刻我觉得,比挨骂更难受的是他还替我兜住了。

以后我再也不敢“全选同步”,宁可多点两遍确认,少写十行代码也值。

面试题:直线镜像

我跟你们说哈,这题“直线镜像”一看名字就很像那种……你以为是小学对折纸,结果一上来给你一条直线、再给你一堆点,让你把点“照镜子”照到直线另一侧去。然后你一激动想用几何画图,画到一半发现——卧槽我又不是美术生,对吧。

其实它核心就一句话:点关于直线的对称点=先把点投影到直线,再沿着法向量走同样距离。 直线我们一般用标准式:a*x + b*y + c = 0。点是 (x0, y0)。

关键那个距离比例 d 是:d = (a*x0 + b*y0 + c) / (a*a + b*b)你别看它像玄学,其实就是“带进去看点在直线哪边、离多远”。

然后镜像点 (x', y') 直接一脚踹过去两倍距离:x' = x0 - 2*a*dy' = y0 - 2*b*d

就这……真就这。你要是题目给的是“直线两点式”(比如给你 (x1,y1) 和 (x2,y2)),那就先把它转成 a,b,c:a = y1 - y2b = x2 - x1c = x1*y2 - x2*y1这三个我每次都背不熟,现场推又慢,所以我代码里直接写死这个推导,省得我脑子当场宕机。

下面给你一份 Java 的核心写法(我按常见输入:先一条直线两点,再给 n 个点;输出镜像点,保留 6 位小数,你们要是题目格式不一样就改读入那几行就行):

import java.io.*;
import java.util.*;

publicclassMain{
staticclassFastScanner{
privatefinal InputStream in = System.in;
privatefinalbyte[] buffer = newbyte[1 << 16];
privateint ptr = 0, len = 0;
privateintreadByte()throws IOException {
if (ptr >= len) {
                len = in.read(buffer);
                ptr = 0;
if (len <= 0) return -1;
            }
return buffer[ptr++];
        }
doublenextDouble()throws IOException {
int c;
do { c = readByte(); } while (c <= ' ' && c != -1);
if (c == -1) return Double.NaN;
int sign = 1;
if (c == '-') { sign = -1; c = readByte(); }
double val = 0;
while (c > ' ' && c != '.' && c != -1) {
                val = val * 10 + (c - '0');
                c = readByte();
            }
if (c == '.') {
double base = 1;
                c = readByte();
while (c > ' ' && c != -1) {
                    base *= 0.1;
                    val += (c - '0') * base;
                    c = readByte();
                }
            }
return val * sign;
        }
intnextInt()throws IOException { return (int) nextDouble(); }
    }

publicstaticvoidmain(String[] args)throws Exception {
        FastScanner fs = new FastScanner();
        StringBuilder out = new StringBuilder();

// 直线由两点确定:(x1,y1) (x2,y2)
double x1 = fs.nextDouble(), y1 = fs.nextDouble();
double x2 = fs.nextDouble(), y2 = fs.nextDouble();
int n = fs.nextInt();

// 转 ax + by + c = 0
double a = y1 - y2;
double b = x2 - x1;
double c = x1 * y2 - x2 * y1;

double denom = a * a + b * b; // (a^2 + b^2)

for (int i = 0; i < n; i++) {
double x0 = fs.nextDouble(), y0 = fs.nextDouble();
double d = (a * x0 + b * y0 + c) / denom;

double xr = x0 - 2.0 * a * d;
double yr = y0 - 2.0 * b * d;

            out.append(String.format(Locale.US, "%.6f %.6f%n", xr, yr));
        }

        System.out.print(out);
    }
}

我再啰嗦一句啊:denom = a*a + b*b 这个别忘了用 double,不然你要是用 int,分分钟给你整出“镜像点跑到火星”这种灵异事件。还有输出精度按题来,有的要 %.2f,有的要 %.10f,别死磕我这 6 位,我只是懒。

行了我说完了,我去倒杯水……你们要是输入格式跟我假设的不一样,就把读入那块贴给我,我直接给你对齐成你题目的版本。