get the first numeric position from a string

本文深入探讨了PHP中用于解析SKU(Stock Keeping Unit)字符串的`explode_sku`函数,通过详细解释代码实现过程,帮助开发者更好地理解和运用此功能,提升电商系统库存管理效率。
	public function explode_sku($sku) {
		$sku_arr = str_split($sku);
		foreach ($sku_arr as $key=>$val) {
			if (is_numeric($val)) {
				return $key;
			}
		}
		return false;
	}

 

翻译并用 latex 渲染: First, let's see how many zebra-Like numbers less than or equal to 1018 exist. It turns out there are only 30 of them, and based on some zebra-like number zi , the next one can be calculated using the formula zi+1=4⋅zi+1 . Then, we have to be able to quickly calculate the zebra value for an arbitrary number x . Since each subsequent zebra-like number is approximately 4 times larger than the previous one, intuitively, it seems like a greedy algorithm should be optimal: for any number x , we can determine its zebra value by subtracting the largest zebra-like number that does not exceed x , until x becomes 0 . Let's prove the correctness of the greedy algorithm: Assume that y is the smallest number for which the greedy algorithm does not work, meaning that in the optimal decomposition of y into zebra-like numbers, the largest zebra-like number zi that does not exceed y does not appear at all. If the greedy algorithm works for all numbers less than y , then in the decomposition of the number y , there must be at least one number zi−1 . And since y−zi−1 can be decomposed greedily and will contain at least 3 numbers zi−1 , we will end up with at least 4 numbers zi−1 in the decomposition. Moreover, there will be at least 5 numbers in the decomposition because 4⋅zi−1<zi , which means it is also less than y . Therefore, if the fifth number is 1 , we simply combine 4⋅zi−1 with 1 to obtain zi ; otherwise, we decompose the fifth number into 4 smaller numbers plus 1 , and we also combine this 1 with 4⋅zi−1 to get zi . Thus, the new decomposition of the number y into zebra-like numbers will have no more numbers than the old one, but it will include the number zi — the maximum zebra-like number that does not exceed y . This means that y can be decomposed greedily. We have reached a contradiction; therefore, the greedy algorithm works for any positive number. Now, let's express the greedy decomposition of the number x in a more convenient form. We will represent the decomposition as a string s of length 30 consisting of digits, where the i -th character will denote how many zebra numbers zi are present in this decomposition. Let's take a closer look at what such a string might look like: si∈{0,1,2,3,4} ; if si=4 , then for any j<i , the character sj=0 (this follows from the proof of the greedy algorithm). Moreover, any number generates a unique string of this form. This is very similar to representing a number in a new numeric system, which we will call zebroid. In summary, the problem has been reduced to counting the number of numbers in the interval [l,r] such that the sum of the digits in the zebroid numeral system equals x . This is a standard problem that can be solved using dynamic programming on digits. Instead of counting the suitable numbers in the interval [l,r] , we will count the suitable numbers in the intervals [1,l] and [1,r] and subtract the first from the second to get the answer. Let dp[ind][sum][num_less_m][was_4] be the number of numbers in the interval [1,m] such that: they have ind+1 digits; the sum of the digits equals sum ; num_less_m=0 if the prefix of ind+1 digits of the number m is lexicographically greater than these numbers, otherwise num_less_m=1 ; was_4=0 if there has not been a 4 in the ind+1 digits of these numbers yet, otherwise was_4=1 . Transitions in this dynamic programming are not very difficult — they are basically appending a new digit at the end. The complexity of the solution is O(log2A) , if we estimate the number of zebra-like numbers up to A=1018 as logA .
08-26
解析:classdef JSON < handle % v = JSON.parse(jsonString) converts a JSON string to a MATLAB value. % % This started out as a recursive descent parser, but JSON is so simple % that most of the parser collapsed out. % % In the service of speed, simplicity, and laziness, this code is NOT a % validator. Its purpose is to convert correct JSON strings to MATLAB % values. It does not reject all malformed JSON. % Copyright 2013 The MathWorks, Inc. properties (Access = private) json % the string index % position in the string end methods (Access = private) function this = JSON(JSONstring) this.json = JSONstring; this.index = 1; end function value = getValue(this) % get the next value in the string token = this.getNextToken; if token == '{' value = this.getObject; elseif token == '[' value = this.getArray; else value = token; end end function number = getNumber(this) first = this.index; last = first; ch = charAt(this,first); if(ch == '-') last = last + 1; ch = charAt(this,last); end while isDigit(ch) last = last + 1; ch = charAt(this,last); end if(ch == '.') last = last + 1; ch = charAt(this,last); while isDigit(ch) last = last + 1; ch = charAt(this,last); end end if ch == 'e' || ch == 'E' last = last + 1; ch = charAt(this,last); if ismember(ch,'+-') last = last + 1; ch = charAt(this,last); end while isDigit(ch) last = last + 1; ch = charAt(this,last); end end % pull out the string str = this.json(first:(last-1)); number = str2double(str); % move past it this.index = last; % helper functions function char = charAt(this,position) if(position > length(this.json)) char = 0; else char = this.json(position); end end function tf = isDigit(aChar) tf = aChar > 47 && aChar < 58; end end function string = getString(this) first = this.index + 1; last = first; str = this.json; ch = str(last); while ch ~= '"' if(ch == '\\') %#ok<STCMP> We KNOW both are single chars last = last + 2; else last = last + 1; end ch = str(last); end % get the string without it's quotes string = str(first:(last-1)); this.index = last + 1; % skip the trailing " end function array = getArray(this) % an array is [ value, ... ] array = {}; value = this.getValue; while ~strcmp(value,']') % got a value array{end+1} = value; %#ok<AGROW> final size is unknowable % followed by a comma or a "]" value = this.getValue; if value == ',' value = this.getValue; elseif value == ']' continue else error('JSON parser requires commas between array elements'); end end % Arrays of all numbers are turned into numeric arrays fcn = @(x) isnumeric(x) && ~isscalar(x); if all(cellfun(fcn,array)) array = [array{:}]; end end function obj = getObject(this) % an object is { string : value, ... } obj = struct; value = this.getValue; while ~strcmp(value,'}') fieldname = value; % make sure its a valid structure field name fieldname = strrep(fieldname,':','_'); fieldname = strrep(fieldname,'-','_'); % check for colon value = this.getValue; if value ~= ':' error('JSON parser requires colons between object names and values'); end % get the value value = this.getValue; obj.(fieldname) = value; value = this.getValue; if value == ',' value = this.getValue; elseif value == '}' continue else error('JSON parser requires commas between object elements'); end end end function token = getNextToken(this) % get whatever is next in the string % skip whitespace ch = this.json(this.index); while isWhitespace(ch) this.index = this.index + 1; ch = this.json(this.index); end % is it a special character? if isSpecial(ch) token = ch; this.index = this.index + 1; return end % is it one of the three keywords? switch(ch) case 't' match(this,'true'); token = true; return; case 'f' match(this,'false'); token = false; return; case 'n' match(this,'null'); token = []; return; end % is it a string? if(ch == '"') token = this.getString; return; end % well, then it better be a number token = this.getNumber; function match(this,str) % find and consume exactly str at the current location of error n = length(str); range = this.index:(this.index + n - 1); found = this.json(range); if strcmp(str,found) this.index = this.index + n; else error('The JSON parser expected "%s" but found %s',str,found) end end function tf = isWhitespace(aChar) % space, carrage return, linefeed, horizontal tab tf = aChar == 32 || aChar == 10 || aChar == 13 || aChar == 9; end function tf = isSpecial(aChar) % the special characters in the JSON "language" tf = aChar == '{' || aChar == '}' || aChar == '['|| aChar == ']'|| aChar == ':' || aChar == ','; end end end methods(Static) % This is the one method you should call from outside the file. % JSON.parse(string)... that should be familiar to Javascrpt % programmers function value = parse(JSONstring) jsonObject = JSON(JSONstring); value = jsonObject.getValue; end end end
08-07
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值