left函数

编程笔试2020221

末鹿安然 提交于 2020-02-22 05:49:59
题目: 一个字符串, 当其中出现超过2个的连续字符时候,将其改写成该字符的数字+该字符。例如'aaaabbcd',改写成‘4abbcd’。 请写一个unzip函数,判断输入的字符串是否符合该改写规则,如果符合,打印原始字符串。 注意:使用left变量传递参数。判断每个字符的前一位是否为数字。 s='10abb4c51d' def unzip(s): left=0 output=[] for i in range(len(s)): c=ord(s[i]) if c>=97 and left==0:#是字母,且左边不是数字 output.append(s[i]) if c>=97 and left>2: output.append(s[i]*left) #print(s[i]*left,end='')#是字母,左边数字>2 left=0 if c>=97 and (left ==1 or left==2): #是字母,左边数字是1或2 return False if c<97: #是数字 left=left*10+int(s[i]) # 是数字 if i==len(s)-1 and c<97: return False return output result=unzip(s) if not result: print('!error') else: for ele in result

logistic回归学习

我们两清 提交于 2020-02-13 20:46:56
logistic回归是一种分类方法,用于两分类的问题,其基本思想为: 寻找合适的假设函数,即分类函数,用来预测输入数据的结果; 构造损失函数,用来表示预测的输出结果与训练数据中实际类别之间的偏差; 最小化损失函数,从而获得最优的模型参数。 首先来看一下sigmoid函数: \(g(x)=\frac{1}{1-e^{x}}\) 它的函数图像为: logistic回归中的假设函数(分类函数): \(h_{\theta }(x)=g(\theta ^{T}x)=\frac{1}{1+e^{-\theta ^{T}x}}\) 解释: \(\theta \) —— 我们在后面要求取的参数; \(T\) —— 向量的转置,默认的向量都是列向量; \(\theta ^{T}x\) —— 列向量\(\theta\)先转置,然后与\(x\)进行点乘,比如: \(\begin{bmatrix}1\\ -1\\ 3\end{bmatrix}^{T}\begin{bmatrix}1\\ 1\\ -1\end{bmatrix} = \begin{bmatrix}1 & -1 & 3\end{bmatrix}\begin{bmatrix}1\\ 1\\ -1\end{bmatrix}=1\times 1+(-1)\times1+3\times(-1) = -3\)

删除排序数组中的重复项的golang实现

痴心易碎 提交于 2020-02-13 07:56:52
给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。 不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。 给定数组 nums = [1,1,2], 函数应该返回新的长度 2, 并且原数组 nums 的前两个元素被修改为 1, 2。 你不需要考虑数组中超出新长度后面的元素。 给定 nums = [0,0,1,1,1,2,2,3,3,4], 函数应该返回新的长度 5, 并且原数组 nums 的前五个元素被修改为 0, 1, 2, 3, 4。 你不需要考虑数组中超出新长度后面的元素。 首先理解题意: 当给定数组为空的时候就应该返回0 而且不能引入其他数组空间,那就是不能再使用一个新的数组来存放结果 还要不重复,数组中超出新长度后面的元素无视 那我们就可以用快慢指针的思想来解答这道题了 给定两个游标left和right 当给定数组的下标为left和right的值一样的话,就不管 当不一样的话,那我们就要做一个操作,就是把当前right下标的值给到left下一个下标 具体代码: func removeDuplicates(nums []int) int { //如果是空切片,那就返回0 if len(nums) == 0 { return 0 } //用两个标记来比较相邻位置的值 //当一样的话

Leetcode——125 验证回文串

不问归期 提交于 2020-02-13 02:11:06
LeetCode125题目 给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。 说明:本题中,我们将空字符串定义为有效的回文串。 示例 1: 输入: “A man, a plan, a canal: Panama” 输出: true 示例 2: 输入: “race a car” 输出: false 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/valid-palindrome 方法一:python内置函数 class Solution : def isPalindrome ( self , s : str ) - > bool : s_filter = ' ' . join ( filter ( str . isalnum , s ) ) . lower ( ) return s_filter [ : : - 1 ] == s_filter Python isalnum() 方法 Python isalnum() 方法检测字符串是否由字母和数字组成。使用方法:str.isalnum() 参考链接https://www.runoob.com/python/att-string-isalnum.html filter() 函数 filter() 函数用于过滤序列,过滤掉不符合条件的元素

[HAOI 2011]Problem b

余生颓废 提交于 2020-02-09 00:08:42
Description 对于给出的n个询问,每次求有多少个数对(x,y),满足a≤x≤b,c≤y≤d,且gcd(x,y) = k,gcd(x,y)函数为x和y的最大公约数。 Input 第一行一个整数n,接下来n行每行五个整数,分别表示a、b、c、d、k Output 共n行,每行一个整数表示满足要求的数对(x,y)的个数 Sample Input 2 2 5 1 5 1 1 5 1 5 2 Sample Output 14 3 HINT 100%的数据满足:1≤n≤50000,1≤a≤b≤50000,1≤c≤d≤50000,1≤k≤50000 题解 记 $f(x, y)$ 为满足 $gcd(i,j)=k$ 的数对 $(i,j)~~(i\in[1,x],j\in[1,y])$ 的个数。 由容斥原理,答案就是 $ans=f(b,d)-f((a-1),d)-f(b,(c-1))+f((a-1),(c-1))$ 。 我们现在考虑如何求 $f(x,y)$ 。 我们按照以往的套路,将 $k$ 提出,显然 $$f(a,b)=\sum_{i=1}^{\left\lfloor\frac{a}{k} \right\rfloor}\sum_{j=1}^{\left\lfloor\frac{b}{k} \right\rfloor}[gcd(i,j)=1]$$ 由公式 $\sum_{d\mid n}

[SDOI 2015]约数个数和

跟風遠走 提交于 2020-02-09 00:07:13
Description 设d(x)为x的约数个数,给定N、M,求 $\sum^N_{i=1}\sum^M_{j=1}d(ij)$ Input 输入文件包含多组测试数据。 第一行,一个整数T,表示测试数据的组数。 接下来的T行,每行两个整数N、M。 Output T行,每行一个整数,表示你所求的答案。 Sample Input 2 7 4 5 6 Sample Output 110 121 HINT 1<=N, M<=50000 1<=T<=50000 题解 先给出一个结论: $$ \sigma_0(ij) = \sum_{a | i} \sum_{b | j} [gcd(a, b) = 1]$$ 证明(摘自 Ken_He ): 我们令 $i = p_1^{a_1} p_2^{a_2} \cdots$ , $j = p_1^{b_1} p_2^{b_2} \cdots$ , $d | ij$ 且 $d = p_1^{c_1} p_2^{c_2} \cdots$ , 则 $c_n \le a_n + b_n$ 。 考虑如何不重复地统计每一个 $d$ : 令 $c_n = A_n + B_n$ , 其中 $A_n$ 和 $B_n$ 分别为 $i$ 和 $j$ 对 $c_n$ 的贡献, 则我们要求 \begin{cases}B_n = 0 & A_n < a_n \\B_n \ge 0 &

剑指offer-调整数组顺序使奇数位于偶数前面

↘锁芯ラ 提交于 2020-02-05 17:06:31
书上题目 描述 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分。 思路 java实现 import java . util . Arrays ; //https://blog.csdn.net/qq_25343557/article/details/79221649 public class reOrderArray_shu { public static void ReorderArray ( int [ ] arr ) { int left = 0 ; int right = arr . length - 1 ; while ( left < right ) { //向后移动left,知道left指向偶数 while ( left < right && isEven ( arr [ left ] ) ) left ++ ; //向前移动right,知道right指向偶数 while ( left < right && ! isEven ( arr [ right ] ) ) right -- ; //交换 if ( left < right ) { int temp = arr [ left ] ; arr [ left ] = arr [ right ] ; arr [ right ] = temp ;

算法(五)

﹥>﹥吖頭↗ 提交于 2020-01-24 11:15:26
1、一堆螺丝和螺母用最短时间匹配。 //分类函数 //n和b为两个数组 //left为左索引,right为右索引 void Fix(int *n, int *b, int left, int right) { if (left < right) { int tmp = n[left]; int i = left, j = right; while (i < j) { while (i < j&&b[i] < tmp) { i++; } while (i < j&&b[j] > tmp) { j--; } if (i < j) { swap(b[i], b[j]); } } b[i] = tmp; swap(b[left], b[i]); cout << "n+b:" << endl; Print(n); Print(b); cout << endl; //一趟下来,i=j的tmp的位置。以tmp为界限,左右分别是小于和大于它的元素 tmp = b[left + 1]; i = left + 1, j = right; while (i < j) { while (i < j&&n[i] < tmp) { i++; } while (i < j&&n[j] > tmp) { j--; } if (i < j) { swap(n[i], n[j]); } } n[i] = tmp;

自学Java之Binary Search

核能气质少年 提交于 2020-01-21 16:21:33
Binary Search 1.回顾 可以用很简单的代码实现二分查找(开始写了另一个函数用来迭代,大概是分治学多了QAQ) public int search ( int [ ] nums , int target ) { int left = 0 , right = nums . length - 1 ; int mid ; while ( left < right ) { mid = ( left + right ) / 2 ; if ( target == nums [ mid ] ) return mid ; if ( target < nums [ mid ] ) right = mid - 1 ; else if ( target > nums [ mid ] ) left = mid + 1 ; } return - 1 ; } 2.三种主要形式 官方给出的三种对比 1.基础,和上面的代码无差别 int binarySearch ( int [ ] nums , int target ) { if ( nums == null || nums . length == 0 ) return - 1 ; int left = 0 , right = nums . length - 1 ; while ( left <= right ) { // Prevent (left

lectcode-寻找峰值

房东的猫 提交于 2020-01-21 02:10:23
要求 峰值元素是指其值大于左右相邻值的元素。 给定一个输入数组 nums,其中 nums[i] ≠ nums[i+1],找到峰值元素并返回其索引。 数组可能包含多个峰值,在这种情况下,返回任何一个峰值所在位置即可。 你可以假设 nums[-1] = nums[n] = -∞。 示例 示例 1: 输入: nums = [1,2,3,1] 输出: 2 解释: 3 是峰值元素,你的函数应该返回其索引 2。 示例 2: 输入: nums = [1,2,1,3,5,6,4] 输出: 1 或 5 解释: 你的函数可以返回索引 1,其峰值元素为 2; 或者返回索引 5, 其峰值元素为 6 代码 线性扫描 int findPeakElement(vector<int>& nums) { int n = nums.size(); for(int i = 0;i<n-1;i++) { if(nums[i]>nums[i+1]) return i; } return n-1; } 递归二分法 int findPeakElement(vector<int>& nums) { int n = nums.size(); return findpeak(nums,0,n-1); } int findpeak(vector<int>& nums,int left,int right) { int mid =