ARTS-第10周-190520

博客围绕算法和代码操作展开。算法部分给出3Sum Closest题解,采用暴力解法并提及可优化。代码操作方面,介绍IE插件编写、屏蔽警告提示、PHP特殊字符清理、mysql字段处理、JS常用操作、HTML空格占位符及IE右键菜单修改等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Algorithm
3Sum Closest

Given an array nums of n integers and an integer target, find three integers in nums such that the sum is closest to target. Return the sum of the three integers. You may assume that each input would have exactly one solution.(来自:LeetCode)
Example:
Given array nums = [-1, 2, 1, -4], and target = 1.
The sum that is closest to the target is 2. (-1 + 2 + 1 = 2).

给定int数组和目标数,从数组中找到3个数字的总和,这3个数字相加总和最接近目标数。假设给定的数组中只能找到一组3个数字总和和目标数最接近的结果。
暴力解法:

static public int ThreeSumClosest(int[] nums, int target)
{
    int result = nums[0] + nums[1] + nums[2];
    int min_closest = Math.Abs(result - target);
    for (int i = 0; i < nums.Length - 2; i++)
    {
        for (int j = i + 1; j < nums.Length - 1; j++)
        {
            for (int k = j + 1; k < nums.Length; k++)
            {
                if (Math.Abs(nums[i] + nums[j] + nums[k] - target)< min_closest)
                {
                    result = nums[i] + nums[j] + nums[k];
                    min_closest = Math.Abs(result - target);
                    if (min_closest == 0) break;
                }
            }
            if (min_closest == 0) break;
        }
        if (min_closest == 0) break;
    }
    return result;
}

这种暴力解法居然通过了,没有说执行时间过长,估计是测试用例里面没有特别苛刻的条件。参考上篇文章中的3Sum解题思路,可以先排序然后再来遍历。这次换个排序方法,用快速排序,也复习下递归的使用。

static public int ThreeSumClosest(int[] nums, int target)
        {
            nums = QuickSort(nums).ToArray();
            int result = nums[0] + nums[1] + nums[2];
            for (int i = 0; i < nums.Length - 2; i++)
            {
                int left = i+1, right = nums.Length - 1;
                while (left<right)
                {
                    int sum = nums[left] + nums[i] + nums[right];
                    if (sum > target)
                    {
                        right--;
                    }
                    else
                    {
                        left++;
                    }
                    if (Math.Abs(sum-target)<Math.Abs(result-target))
                    {
                        result = sum;
                    }
                }
            }
            return result;
        }

        static public List<int> QuickSort(int[] nums)
        {
            List<int> result = new List<int>();
            if (nums.Length == 0) return result;
            List<int> left = new List<int>();
            List<int> right = new List<int>();
            int cur_data = nums[0];
            for (int i = 1; i < nums.Length; i++)
            {
                if (nums[i] >= cur_data)
                {
                    right.Add(nums[i]);
                }
                else
                {
                    left.Add(nums[i]);
                }  
            }
            if (left.Count > 0)
            {
                result = QuickSort(left.ToArray());
            }
            result.Add(cur_data);
            if (right.Count > 0)
            {
                result = result.Concat(QuickSort(right.ToArray())).ToList<int>();
            }
            return result;
        }

因为测试用例的要求不高,也看不出速度的提升,在判断遍历停止的条件上还有优化的空间,就不继续展开了。
Review
最近突然需要了解IE上编写插件的知识点,这些知识点都比较老了,看了一篇还不错的文章。
Creating an Internet Explorer Add-in Toolbar Button using C++ and ATL
这篇文章创建了一个简单的ATL工程,记录了创建一个简单的IE浏览器工具的过程,可以初步的理解IE浏览器工具工作的基本流程。根据这篇文章的过程我试验成功了。
Tips&Share

  • 屏蔽警告提示:#pragma warning(disable : 4996)
  • 给IE浏览器增加自定义右键菜单,参考链接:http://www.voidcn.com/article/p-baermuew-bhq.html。 在和浏览器相关的注册表中增加
  • PHP特殊字符清理
    常见的替换回车换行符:
    $contents = str_replace(array("\r\n", "\r", "\n"), "", $contents);

突然发现数据库中某个字段有空格,通过 nodepad++ 查看了字段的二进制编码,发现是不能识别的编码,或者是特殊编码,转换成字符串时表现为空格。我发现的特殊编码是:
e3 80 80
不能直接utf8替换,就通过多个ASCII来解决

$contents = str_replace(array("\r\n", "\r", "\n",chr(227).chr(128).chr(128)), "", $contents);

参考链接:https://www.cnblogs.com/oldphper/p/4128138.html

  • mysql如何去除字段首尾空白字符及特定字符

通过查看16进制编码,发现空格编号的编码是 e3 80 80 的空格,使用
replace(field,char(14909568),’’) 代码去掉特殊字符串,其中 field 是需要处理的字段。

  • 记录JS的一些常用操作

平常用JQuery,突然要使用单纯的js脚本的时候发现很多方法不能立刻想到,记录下。
获得 iframe 对象的几种方法:https://www.cnblogs.com/lyf22/p/4354086.html
getElementsByTagName(‘iframe’),我使用这种方式比较稳定,或者是getElementById
如果需要获取一个table,而这个table没有id属性,可以使用getElementsByTagName获取table,然后便利找到指定的table.
获取table的行和列条数,对于table的行列操作,有点像数组操作。

var table = document.getElementById("table_id") ;
//表格行数
var rows = table.rows.length ;
//表格列数
var cells = table.rows.item(0).cells.length ;
  • js 实现简单的 trim 函数
function trim(str){ //删除左右两端的空格
    return str.replace(/(^\s*)|(\s*$)/g, "");
}
function ltrim(str){ //删除左边的空格
    return str.replace(/(^\s*)/g,"");
}
function rtrim(str){ //删除右边的空格
   	return str.replace(/(\s*$)/g,"");
}
   
  • js中XMLHttpRequest对象实现GET、POST异步传输

https://www.cnblogs.com/yuanke/p/4998516.html

  • js 实现 json stringgify

参考网站:https://blog.youkuaiyun.com/xiaobianjava/article/details/54907434
百度出来都是这个版本的代码,基本的思路是针对不同的数据类型组成字符串。

  • HTML空格占位符–https://blog.youkuaiyun.com/sforiz/article/details/43937237
    &#32; == 普通的英文半角空格
    &#160; == &nbsp; ==&#xA0; == no-break space (普通的英文半角空格但不换行)
    &#12288; == 中文全角空格 (一个中文宽度)
    &#8194; == &ensp; == en空格 (半个中文宽度)
    &#8195; == &emsp; == em空格 (一个中文宽度)
    &#8197; == 四分之一em空格 (四分之一中文宽度)

  • html空格字符– 这就是我编程中遇到的特殊字符串

使用全角空格IDEOGRAPHIC SPACE----&#x3000;

Encodings
HTML Entity (decimal)&#12288;
HTML Entity (hex)&#x3000;
How to type in Microsoft WindowsAlt +3000
UTF-8 (hex)0xE3 0x80 0x80 (e38080)
UTF-8 (binary)11100011:10000000:10000000
UTF-16 (hex)0x3000 (3000)
UTF-16 (decimal)12,288
UTF-32 (hex)0x00003000 (3000)
UTF-32 (decimal)12,288
C/C++/Java source code“\u3000”
Python source codeu"\u3000"
  • IE 右键菜单

Win7 查看注册表,点开开始菜单,输入 regedit.exe , 可以查看注册表。和右键相关的注册表是:HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\MenuExt
可以查看已经存在的右键菜单。
通过修改注册表可以增加新的右键菜单,创建一个文本文件,修改后缀名为.reg,文件内容如下:

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\MenuExt\自定义右键菜单]
@="E:\\baidu.htm"

IEAddOnJS.html是点击右键菜单时候,可以进行一些个人操作的js脚本,例如获取页面上需要的信息。

<script language="javascript" defer>
var parentwin = external.menuArguments;
var doc = parentwin.document;
var baidu = doc.getElementById('su');
if(baidu!=null)
{
	alert(baidu.value);
}
</script>

在百度首页点击右键菜单,就能弹出一个对话框,显示“百度一下”。
有的时候会出现乱码,应该是编码格式的原因。默认是 ANSI 编码,如果把注册表的文件编码换成 UTF-8,执行reg文件的时候会报错。本来想把json库加载进去,发现JSON文件报错,就不继续尝试了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值